我需要更新抽象类的所有方法吗?

问题描述 投票:4回答:5

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

基类是由框架编写的,因此我无法更改它(我在谈论ASP.NET MVC的RoleProvider

c# inheritance abstract-class roleprovider
5个回答
13
投票
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


4
投票

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

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


3
投票

这里的真正问题是,您的基类有很多方法,以致派生类只能使用它们的子集。这意味着您的基类很可能承担多重责任,因此违反了Single Responsibility Principle (SRP)

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


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


2
投票

没有任何方法可以覆盖我只需要的内容。

不,那是抽象类的工作方式。如果您也使类抽象化,则不需要实现所有方法。


1
投票

必须重写所有声明为abstract的方法。您不能跳过非具体方法。如果您确实想这样做,则将您的类设为抽象。您不能更改抽象机制。

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

© www.soinside.com 2019 - 2024. All rights reserved.