一尘不染

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

c#

我了解C#不支持静态方法继承。我还阅读了许多讨论(包括此处的讨论),在这些讨论中,开发人员声称需要此功能,典型的回答是“如果需要静态成员继承,则设计中会有缺陷”。

好吧,鉴于OOP甚至不想让我考虑静态继承,因此我必须得出结论,我对它的明显需求指向了我的设计中的错误。但是,我被困住了。我非常感谢您为解决此问题提供的帮助。这是挑战…

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

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

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

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


阅读 322

收藏
2020-05-19

共1个答案

一尘不染

一个想法:

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

无需额外的工厂课程。

2020-05-19