【发布时间】:2023-04-09 05:47:02
【问题描述】:
我了解 C# 不支持静态方法继承。我还阅读了一些讨论(包括此处),其中开发人员声称需要此功能,典型的回应是“如果您需要静态成员继承,那么您的设计就有缺陷”。
好的,鉴于 OOP 甚至不希望我考虑静态继承,我必须得出结论,我对它的明显需求表明我的设计存在错误。但是,我被困住了。我真的很感谢一些帮助解决这个问题。这是挑战...
我想创建一个抽象基类(我们称之为 Fruit),它封装了一些复杂的初始化代码。此代码不能放在构造函数中,因为其中一些将依赖于虚拟方法调用。
Fruit 将被其他具体类(Apple、Orange)继承,每个具体类都必须公开标准工厂方法 CreateInstance() 来创建和初始化实例。
如果静态成员继承可行,我会将工厂方法放在基类中,并使用对派生类的虚拟方法调用来获取必须初始化具体实例的类型。客户端代码会简单地调用 Apple.CreateInstance() 来获取完全初始化的 Apple 实例。
但显然这是不可能的,所以有人可以解释一下我的设计需要如何更改以适应相同的功能。
【问题讨论】:
-
我想指出“这段代码不能放在构造函数中,因为其中一些将依赖于虚拟方法调用”的说法是不正确的。您可以在构造函数中调用虚拟方法。 (你必须仔细设计你的调用,因为当调用虚拟方法时你可以有一个部分初始化的类,但它是受支持的。)有关更多详细信息,请参阅 Ravadre 的答案。
标签: c# .net inheritance static