我需要从一个基本的抽象类继承。我想只覆盖一个方法。但Visual Studio迫使我全部覆盖它们。所以我重写了超过10种抛出NonImplementedException
的方法我发现它很愚蠢。有没有办法只覆盖我需要的东西。或者至少告诉Visual Studio覆盖其余的(未实现的方法和属性)?
基类是由框架编写的,所以我无法改变它(我在谈论Asp.net MVC的RoleProvider)
答案 0 :(得分:11)
abstract class Base
{
public void Method1()
{
//some code
} // No need to override
public abstract void Method2(); // must be overriden
public virtual void Method3()
{
// some code
} // Not necessarily be overriden
}
class Derived : Base
{
}
此处编译器只会要求您override
Method2()
作为授权。它不会要求您覆盖Method1()
或Method3()
。您可以override
Method3()
,因为它带有关键字virtual
。
答案 1 :(得分:3)
这里真正的问题是你有一个基类有很多方法,派生类只能用它们的子集。这意味着您的基类很可能有多重责任,因此违反了Single Responsibility Principle (SRP)。
解决方案是将基类拆分为几个较小的类,其中每个类都只有一个责任。
如果基类不是来自你,你真的需要实现所有这些方法
如果基类是违反SRP的类,并且如果只实现方法的一小部分,则实现可以正常工作,您可以创建从该其他抽象基类派生的抽象基类。在您的抽象基类中,您可以实现所有不需要的方法并抛出NotImplementedException
。不要实施你需要的那些方法
现在,从您的基类派生一个类 - 您现在只需实现您感兴趣的方法。请务必正确记录。
答案 2 :(得分:2)
有没有办法只覆盖我需要的东西。
不,这就是抽象类的工作方式。如果你使你的类抽象化,你也不需要实现所有方法。
答案 3 :(得分:2)
如果方法是抽象,则必须覆盖。
如果方法虚拟,您可以覆盖但不一定
答案 4 :(得分:1)
必须覆盖所有声明为abstract
的方法。你不能跳过非具体的方法。如果你真的想这样做,那么你的课程就像抽象一样。你无法改变抽象的机制。
记住
抽象类具有以下特征:
1.抽象类无法实例化
抽象类可能包含抽象方法和访问器
3.无法使用sealed修饰符修改抽象类,这意味着不能继承该类
4.从抽象类派生的非抽象类必须包括所有继承的抽象方法和访问器的实际实现。