c# - 为什么抽象类要实现抽象基类的抽象方法?

标签 c# .net design-patterns abstract-class

在下面的示例中,Derived 类实现了 Main 类的抽象方法 method。但是我想不出有什么理由在抽象Derived类的实现中填写方法体。当然,我应该只在真实类中实现抽象方法。

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

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

class RealClass : Derived
{

}

最佳答案

通常,如果有人指定一个抽象类有一个抽象方法,要么是因为该类的某些功能依赖于该方法,要么是因为它是预期 API 的一部分,对它没有意义此时要实现的父类。在任何一种情况下,一旦您获得该类的非抽象实现,就必须有一个实现。

另请注意,如果您正在实现一个接口(interface),您需要说明该接口(interface)将如何实现,即使您只是调用成员抽象并将责任传递给子类也是如此

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();
}

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

public abstract class Quadruped : Pet
{
    public override int CountLegs () { return 4; }
}

如果您的实现是非抽象的,但所讨论方法的标准原因确实不适用于您的情况,您可以执行无操作方法(在 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"); }
}

这是否回答了您的问题?

关于c# - 为什么抽象类要实现抽象基类的抽象方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3271682/

相关文章:

c# - 在 C# 中使用目标配置时不允许 SAP 硬编码登录参数

c# - 从 C# 控制台应用程序使用 Edge.js

c# - 使用 EPPLus 获取合并的单元格区域

c# - 从字符串末尾子字符串

php - PHP 单例类的最佳实践

php - 网站开发什么时候用观察者模式?

c# - Gmail 错误 :The SMTP server requires a secure connection or the client was not authenticated. 服务器响应为 : 5. 5.1 需要身份验证

c# - C# 中的参数名称更改是运行时中断更改吗?

c++ - 在 C++ 中,可迭代类型应该是非多态的吗?

c# - Azure Function 输出与 Azure.Cosmos.Table 绑定(bind)