我需要从一个基本的抽象类继承。我只想覆盖一种方法。但是 Visual Studio 要求我全部重写,所以我重写了 10 多个 throw 方法NonImplementedException
,我觉得这很愚蠢。有没有办法只覆盖我需要的东西。或者至少告诉 Visual Studio 覆盖其余部分(未实现的方法和属性)?
基类是框架写的所以不能改(我说RoleProvider
的是ASP.NET MVC)
我需要从一个基本的抽象类继承。我只想覆盖一种方法。但是 Visual Studio 要求我全部重写,所以我重写了 10 多个 throw 方法NonImplementedException
,我觉得这很愚蠢。有没有办法只覆盖我需要的东西。或者至少告诉 Visual Studio 覆盖其余部分(未实现的方法和属性)?
基类是框架写的所以不能改(我说RoleProvider
的是ASP.NET MVC)
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
。
如果方法是抽象的,则必须重写。
如果方法是virtual,您可以覆盖但不一定
这里真正的问题是你有一个基类,其中包含太多方法,派生类只能使用其中的一个子集。这意味着您的基类很可能有多个职责,因此违反了单一职责原则 (SRP)。
解决方案是将您的基类拆分为几个较小的类,其中每个类都有一个职责。
如果基类不是你的,你真的需要实现所有这些方法。
如果基类是违反 SRP 的类,并且如果您只实现一小部分方法,您的实现可以真正正常工作,您可以创建一个派生自该其他抽象基类的抽象基类。在您的抽象基类中,您可以实现所有不需要的方法并抛出NotImplementedException
. 不要实现你需要的那些方法。
现在,从你的基类派生一个类——你现在只需要实现你感兴趣的方法。一定要正确地记录它。
有没有办法只覆盖我需要的东西。
不,这就是抽象类的工作方式。如果你也让你的类抽象,你就不需要实现所有方法。
有必要覆盖所有声明为abstract
. 你不能跳过非具体的方法。如果你真的想做,那么让你的类抽象。你不能改变抽象的机制。
请记住,抽象类具有以下特性:
您还可以创建一个抽象类来继承和实现所有方法(使用 NotImplementedException),然后您的子类可以继承该抽象类并仅实现与您相关的方法。