我知道C#不支持静态方法继承.我也读过一些讨论(包括这里),其中开发人员声称需要这个功能,典型的回答是"如果需要静态成员继承,那么设计中就有缺陷".

好的,鉴于OOP甚至不想让我考虑静电继承,我必须得出结论,我对它的明显需求指出了我的设计中的一个错误.但是,我被困住了.如果能帮我解决这个问题,我会非常感激.挑战来了.

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

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

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

但显然这是不可能的,所以请谁解释一下我的设计需要如何改变才能适应同样的功能.

推荐答案

一个 idea 是:

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

不需要额外的工厂课程.

.net相关问答推荐

使用PowerShell在Windows容器内安装exe

PowerShell 5.1和7在使用证书时的区别

使用 DataDog 收集 OpenTelemetry 跟踪

查找所有源硬编码字符串

什么是提升运算符?

将 Moq 模拟对象传递给构造函数

我应该创建一个 DateRange 对象吗?

maxRequestLength 的最大值?

在c#中计算中位数

如何在任务栏顶部全屏显示 Windows 窗体?

使文本框不可编辑

如何使用 c# 仅获取目录中的文件名?

如何在 C# 中以编程方式安装 Windows 服务?

如何防止任务的同步延续?

场与财产.性能优化

CI服务器的比较?

立即检测客户端与服务器套接字的断开连接

从流中获取 TextReader?

MailMessage,Sender 和 From 属性的区别

可以从 C# 调用 C++ 代码吗?