c# - 静态方法继承的正确替代方法是什么?

标签 c# .net inheritance static

我了解到 C# 不支持静态方法继承。我还阅读了许多讨论(包括此处),其中开发人员声称需要此功能,对此的典型回应是“如果您需要静态成员继承,那么您的设计存在缺陷”。

好的,鉴于 OOP 甚至不想让我考虑静态继承,我必须得出结论,我对它的明显需求表明我的设计存在错误。但是,我卡住了。我真的很感激一些帮助解决这个问题。这是挑战......

我想创建一个封装了一些复杂初始化代码的抽象基类(我们称之为 Fruit)。此代码不能放在构造函数中,因为其中一些代码将依赖于虚方法调用。

Fruit 将被其他具体类(Apple、Orange)继承,每个具体类都必须公开一个标准工厂方法 CreateInstance() 来创建和初始化一个实例。

如果静态成员继承是可行的,我会将工厂方法放在基类中,并使用对派生类的虚方法调用来获取必须从中初始化具体实例的类型。客户端代码将简单调用 Apple.CreateInstance() 以获得完全初始化的 Apple 实例。

但显然这是不可能的,所以有人可以解释一下我的设计需要如何更改以适应相同的功能。

最佳答案

一个想法:

public abstract class Fruit<T>
    where T : Fruit<T>, new()
{
    public static T CreateInstance()
    {
        T newFruit = new T();
        newFruit.Initialize();  // Calls Apple.Initialize
        return newFruit;
    }

    protected abstract void Initialize();
}

public class Apple : Fruit<Apple>
{
    protected override void Initialize() { ... }
}

然后这样调用:

Apple myAppleVar = Fruit<Apple>.CreateInstance();

不需要额外的工厂类。

关于c# - 静态方法继承的正确替代方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1380087/

相关文章:

.net - .Net 项目所需的免费或商业 SCP 库

java - 在子类中实现 clone()

java - 处理父类(super class)型的所有子类型

.net - 是否有.NET方式来存储类似于自定义类的时间段?

c# - Windows Phone 8.1 后台定时器停止音乐

c# - 可选的多维数组作为 C# 中的参数

c# - 检查类是否不是类型的更易读的方法?

c# - DataGridView 从列标签获取 ColumnName

c# - 从 C# 中的基类获取派生类型?

c# - 如何在 ASP.NET MVC 中发布后更改表单值?