c# - 接口(interface)与继承 : which is better in this case?

标签 c# inheritance interface

假设我有一个小部件类:

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/

相关文章:

java - 当我打印我的对象时,对象的物种显示为空,而不是说物种(例如应该说炎魔)

c# - 为 WCF 实现接口(interface)时不能使用可选参数

java - Java中重写接口(interface)方法

c# - 在 ASP.NET 中查找给定周(月)后的日期

c# - 如何获取Windows窗体中的按钮控件 - Panel

c# - Linq 从嵌套元素加入和投影

c# - 如何使 EF 使用字符串连接构建更新 SQL?

java - 使用自定义构造函数设置 BaseActivity 以从子类提供数据

c++ - 使用回调来自定义类而不是子类化

c# - 通用接口(interface)和方法问题