6

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

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

4

6 回答 6

17
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

于 2013-02-18T08:49:08.557 回答
7

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

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

于 2017-04-15T14:24:16.020 回答
3

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

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


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

于 2013-02-18T08:46:59.317 回答
2

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

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

于 2013-02-18T08:46:15.127 回答
1

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

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

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

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

于 2021-08-23T06:59:01.647 回答