繁体   English   中英

我需要更新抽象类的所有方法吗?

[英]Do I need to update all the methods of an abstract class?

我需要从一个基本的抽象类继承。 我只想覆盖一种方法。 但是 Visual Studio 强制我覆盖它们,所以我覆盖了 10 多个抛出NonImplementedException方法,我觉得它很愚蠢。 没有任何方法可以仅覆盖我需要的内容。 或者至少告诉 Visual Studio 覆盖其余部分(未实现的方法和属性)?

基类是框架写的所以我不能改(我说的是ASP.NET MVC的RoleProvider

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
{
}

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

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

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

这里真正的问题是您有一个包含如此多方法的基类,以至于派生类只能使用其中的一个子集。 这意味着您的基类很可能有多个职责,因此违反了单一职责原则 (SRP)

解决方案是将您的基类拆分为几个较小的类,其中每个类都只有一个职责。


如果基类不是你的,你真的需要实现所有这些方法。
如果基类是违反 SRP 的类,并且如果您只实现方法的一小部分,您的实现可以真正正常工作,您可以创建一个从其他抽象基类派生的抽象基类。 在您的抽象基类中,您可以实现所有不需要的方法并抛出NotImplementedException 不要实现你需要的那些方法。
现在,从你的基类派生一个类——你现在只需要实现你感兴趣的方法。一定要正确地记录它。

没有任何方法可以仅覆盖我需要的内容。

不,这就是抽象类的工作方式。 如果您也将类设为抽象类,则不需要实现所有方法。

有必要覆盖所有声明为abstract的方法。 你不能跳过非具体方法。 如果你真的想做,那么让你的课程成为抽象的。 你不能改变抽象机制。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM