抽象类我不需要覆盖所有方法?

You*_* Ch 4 c# inheritance abstract-class

我需要继承一个基本的抽象类.我想只覆盖一个方法.但Visual Studio要求我全部覆盖它们.所以我重写了超过10种抛出的方法,NonImplementedException我觉得它很愚蠢.有没有办法只覆盖我需要的东西.或者至少告诉Visual Studio覆盖其余的(未实现的方法和属性)?

基类是由框架编写的,所以我无法改变它(我说的是Asp.net MVC的RoleProvider)

mih*_*irj 13

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
{
}
Run Code Online (Sandbox Code Playgroud)

在这里,编译器只会要求您override Method2()作为授权.它不会要求你覆盖Method1()Method3().你可以override Method3()因为它带有关键字virtual.


小智 6

如果方法是抽象的,则必须重写

如果方法是virtual,您可以覆盖但不一定


Dan*_*rth 5

这里真正的问题是,您的基类具有如此多的方法,以至于派生类只能使用它们的子集。这意味着您的基类很可能具有多重职责,从而违反了单一职责原则(SRP)

解决方案是将您的基类分成几个较小的类,每个类只负责一个职责。


如果基类不是来自您,您确实需要实现所有这些方法。
如果基类是违反 SRP 的类,并且您的实现确实可以正常工作(如果您仅实现方法的一小部分),则可以创建从其他抽象基类派生的抽象基类。在抽象基类中,您可以实现所有不需要的方法并抛出NotImplementedException. 不要实现您需要的那些方法。
现在,从基类派生一个类 - 现在您只需实现您感兴趣的方法。请务必正确记录这一点。


asi*_*d88 1

有必要重写所有声明为 的方法abstract。你不能跳过非具体方法。如果你真的想做,那么就把你的类设置为抽象类。你无法改变抽象机制。

请记住,抽象类具有以下特征:

  1. 抽象类不能被实例化。
  2. 抽象类可以包含抽象方法和访问器。
  3. 不能用sealed修饰符修改抽象类,这意味着该类不能被继承。
  4. 从抽象类派生的非抽象类必须包含所有继承的抽象方法和访问器的实际实现。