[英]Why do we need Interface when same thing as Interface can be achieved by making all methods abstract in an abstract class?
[英]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
的方法。 你不能跳过非具体方法。 如果你真的想做,那么让你的课程成为抽象的。 你不能改变抽象机制。
请记住,抽象类具有以下特性:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.