为什么抽象类应该实现抽象基类的抽象方法?

Fre*_*ood 2 .net c# abstract-class design-patterns

在以下示例中,该类从类Derived实现抽象方法.但我想不出在抽象类的实现中填充方法体的原因.当然,我应该只在实际类中实现抽象方法.methodMainDerived

那我怎么能避免这样做呢?我还可以做些什么?

abstract class Main
{
    public abstract void method();
}
abstract class Derived : Main
{
    public override void method()
    { 
    }
}

class RealClass : Derived
{

}
Run Code Online (Sandbox Code Playgroud)

Str*_*ior 9

通常,如果有人指定抽象类具有抽象方法,那么要么是因为该类依赖于该方法所做的某些操作,要么是因为它是预期API的一部分,对于父类是没有意义的在这个时候实施.在任何一种情况下,一旦你进入类的非抽象实现,就必须有一个实现.

另请注意,如果要实现接口,则需要说明如何实现该接口,即使您只是调用成员abstract并将责任传递给子类

public interface IPet {string GetNoise(); int CountLegs(); void Walk();}
public abstract class Pet : IPet
{
    public string Name {get; set;}
    public abstract string GetNoise(); // These must be here
    public abstract int CountLegs();
    public abstract void Walk();
}
Run Code Online (Sandbox Code Playgroud)

在实现子类时,您可以根据具体情况选择一些.如果您的实现本身是一个抽象类,则不需要实现抽象方法.

public abstract class Quadruped : Pet
{
    public override int CountLegs () { return 4; }
}
Run Code Online (Sandbox Code Playgroud)

如果您的实现是非抽象的,但该方法的标准原因确实不适用于您的情况,您可以执行无操作方法(在void方法的情况下),或返回一些虚拟值,或者甚至抛出一个NotImplementedException来指示永远不应该首先调用该方法.

public class Fish : Pet
{
    public override string GetNoise() {return "";} // dummy value: fish don't make noise
    public override int CountLegs() {return 0;}
    public override void Walk() {} // No-op
    // public override void Walk() { throw new NotImplementedException("Fish can't walk"); }
}
Run Code Online (Sandbox Code Playgroud)

这是否回答你的问题?

  • +1,很好的答案.严格来说,我认为`Quadruped`中的`CountLegs`方法应该是密封的,否则任何人都可以创建一个有三条腿的四足动物;) (4认同)