c# – 接口与继承:在这种情况下哪个更好?

假设我有一个widget类:

struct Widget {
    public Color Color { get; set; }
    public int Frobbles { get; set; }
}

现在,我需要创建一个工厂来创建这些小部件,所以我构建了一个WidgetFactory:

abstract class WidgetFactory {
    public virtual Widget GetWidget();
}

事实证明,你可以用几种不同的材料制作小部件,但结果小部件几乎是一样的.所以,我有一些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应该是一个抽象类还是一个接口?我可以看到两个方向的争论:

基类:

>实施ARE WidgetFactories
>他们可能能够共享功能,(例如,List< Widget> WidgetFactory.GetAllWidgets()方法)

接口:

>实现不会从父级继承任何数据或功能
>他们的内部运作完全不同
>只定义了一种方法

对于那些回答的人来说,这并不(目前)与任何现实世界的问题并行,但是如果/当我需要实现这种模式时,最好知道.此外,“无关紧要”是一个有效的答案.

编辑:我应该指出为什么要首先通过这个.这个类层次结构的假设用法如下:

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

所以,在WidgetFactory中使用GetGoldWidget()方法并不是一个好主意.另外,Widget技术的出现也许让我们在未来添加不同的,更奇特的小部件类型?添加一个新类来处理它们比将现有类中的方法变为现有类更简单,更简洁.

最佳答案
老实说,除了Concrete Factory类之外,你还希望从WidgetFactory继承吗?什么?……永远?
如果不是,它可能不重要.
如果您希望在它们之间添加公共代码,那么除了抽象类之外,您最好的选择.
此外,我并不认为您的工厂方法需要实现除创建方法之外的任何其他接口.因此无论是抽象还是界面都无关紧要.这一切都归结为将来是否需要在抽象类中添加其他功能.

转载注明原文:c# – 接口与继承:在这种情况下哪个更好? - 代码日志