假设我有一个小部件类:
struct Widget {
public Color Color { get; set; }
public int Frobbles { get; set; }
}
现在,我需要创建一个工厂来创建这些小部件,因此我构建了一个 WidgetFactory:
abstract class WidgetFactory {
public virtual Widget GetWidget();
}
事实证明,您可以用几种不同的 Material 制作小部件,但最终的小部件几乎是一样的。所以,我有一些 WidgetFactory 的实现:
class GoldWidgetFactory : WidgetFactory {
public GoldWidgetFactory(GoldMine goldmine) {
//...
}
public Widget GetWidget() {
Gold g = goldmine.getGold();
//...
}
}
class XMLWidgetFactory : WidgetFactory {
public XMLWidgetFactory(XmlDocument xmlsource) {
//...
}
public Widget GetWidget() {
XmlNode node = //whatever
//...
}
}
class MagicWidgetFactory : WidgetFactory {
public Widget GetWidget() {
//creates widget from nothing
}
}
我的问题是:WidgetFactory 应该是一个抽象类,还是一个接口(interface)?我可以看到两个方向的参数:
基类:
- 实现是 WidgetFactories
- 他们可能能够共享功能,(例如,
List<Widget> WidgetFactory.GetAllWidgets()
方法)
接口(interface):
- 实现不从父级继承任何数据或功能
- 他们的内部运作方式完全不同
- 只定义了一个方法
对于那些回答者,这(目前)与任何现实世界的问题都不平行,但如果/当我需要实现这种模式时,最好知道。此外,“没关系”是一个有效的答案。
编辑:我应该指出为什么首先要经历这个。这个类层次结构的假设用法是这样的:
//create a widget factory
WidgetFactory factory = new GoldWidgetFactory(myGoldMine);
//get a widget for our own nefarious purposes
Widget widget = factory.GetWidget();
//this method needs a few widgets
ConsumeWidgets(factory);
所以,有一个 GetGoldWidget()
WidgetFactory 中的方法不是一个好主意。另外,也许 Widget 技术的出现允许我们在未来添加不同的和更奇特的 widget 类型?添加一个新类来处理它们比将方法硬塞进现有类更容易、更清晰。
最佳答案
在您给出的示例中,WidgetFactory
绝对没有理由成为抽象类,因为工厂的不同实现之间没有共享属性或方法。
即使有共享功能,制作一个接口(interface)并将其传递给 WidgetFactory
的用户也会更符合习惯,以减少这些组件需要了解工厂的知识量.
整体实现很好,确实是一个 abstract factory pattern ,我唯一要做的是 IWidgetFactory
:
public interface IWidgetFactory {
Widget GetWidget();
}
abstract class WidgetFactory : IWidgetFactory {
//common attributes and methods
}
//Defferent implementations can still inherit from the base abstract class
class GoldWidgetFactory : WidgetFactory {
public GoldWidgetFactory(GoldMine goldmine) {
//...
}
public Widget GetWidget() {
Gold g = goldmine.getGold();
//...
}
}
关于c# - 接口(interface)与继承 : which is better in this case?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3455563/