我需要更新一个抽象类的所有方法吗
本文关键字:抽象类 一个 有方法 更新 | 更新日期: 2023-09-27 17:59:56
我需要从一个基本抽象类继承。我只想覆盖一个方法。但是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
{
}
在这里,编译器将只要求您将override
Method2()
作为命令。它不会要求您覆盖Method1()
或Method3()
。您可以override
Method3()
,因为它带有关键字virtual
。
如果方法是抽象,则必须覆盖。
如果方法是虚拟,则可以覆盖
这里真正的问题是,一个基类有太多方法,以至于派生类只能使用其中的一个子集。这意味着您的基类很可能具有多重责任,因此违反了单一责任原则(SRP)。
解决方案是将基类拆分为几个较小的类,每个类都有一个职责。
如果基类不是来自您,那么您确实需要实现所有这些方法
如果基类是一个违反SRP的类,并且如果只实现方法的一小部分,则您的实现可以真正正常工作,那么您可以创建一个从其他抽象基类派生的抽象基类。在抽象基类中,您可以实现所有不需要的方法,并抛出NotImplementedException
。不要实施那些你需要的方法
现在,从基类派生一个类-你现在只需要实现你感兴趣的方法。一定要正确地记录这一点。
难道没有任何方法可以只覆盖我需要的东西吗。
不,抽象类就是这样工作的。如果你也让你的类抽象,你就不需要实现所有的方法。
有必要覆盖所有声明为abstract
的方法。不能跳过非具体方法。如果你真的想这样做,那就让你的课变得抽象。你不能改变抽象的机制。
记住,抽象类具有以下特性:
- 抽象类无法实例化
- 抽象类可能包含抽象方法和访问器
- 不能用密封修饰符修改抽象类,这意味着该类不能被继承
- 从抽象类派生的非抽象类必须包括所有继承的抽象方法和访问器的实际实现
您还可以创建一个抽象类,该类将继承并实现所有方法(使用NotImplementedException),然后您的子类可以继承该抽象类,并仅实现与您相关的方法。