【问题标题】:Do I need to update all the methods of an abstract class?我需要更新抽象类的所有方法吗?
【发布时间】:2013-02-02 15:35:37
【问题描述】:

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

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

【问题讨论】:

  • 你应该只需要实现那些没有默认实现的。如果您愿意,您可以向返回异常的基类添加默认实现。
  • 如果您不使用任何其他方法,那么您可以留下虚拟的throw new NonImplementedException(); 方法体。
  • 有人投了反对票,但我改为赞成。看起来在 Stackoverflow 中这里是不允许有基本疑问的。

标签: c# inheritance abstract-class roleprovider


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    没有办法只覆盖我需要的东西。

    不,抽象类就是这样工作的。如果你也让你的类抽象,你就不需要实现所有的方法。

    【讨论】:

      【解决方案3】:

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

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


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

      【讨论】:

      • 看起来他可能最近编辑了他的问题,提到基类来自 Microsoft,所以他无法更改。
      • @MatthewWatson:感谢您的提示。修改了我对这个案例的回答。
      【解决方案4】:
      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()。你可以overrideMethod3(),因为它带有关键字virtual

      【讨论】:

      • 这是一个非常简单的解释方式。谢谢。
      【解决方案5】:

      如果方法是abstract,您必须重写

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

      【讨论】:

        【解决方案6】:

        您还可以创建一个抽象类来继承和实现所有方法(使用 NotImplementedException),然后您的子类可以继承该抽象类并仅实现与您相关的方法。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-05-22
          • 2020-04-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多