【问题标题】:Name this design pattern命名此设计模式
【发布时间】:2014-11-13 18:30:40
【问题描述】:

在研究 C# 中继承概念的实际使用时,我遇到了一个有趣的代码模式。非泛型接口I 多次继承泛型类型I<T>,每次都有不同的类型参数。 II<T> 继承的唯一原因是为了声明重载,I<T> 在代码中的任何地方都不会被引用,除了继承关系。举例说明:

interface Combined : Operations<Int32>, Operations<Int64>, Operations<double> {}

interface Operations<T> {
    T Add(T left, T right);
    T Multiply(T left, T right);
}

实际上,IOperations 接口有 30 个方法和大量的 XML 文档,因此不希望多次重复这些声明似乎是合乎逻辑的。我搜索了“重载重复设计”和“方法声明重用设计模式”等,但找不到任何有用的信息。

也许这种模式在支持多继承的语言(如 C++)中具有更深远的用途,其中还可以提供操作的实现。

tl;dr:你能说出上面代码示例中的设计模式吗?

【问题讨论】:

    标签: templates design-patterns interface


    【解决方案1】:

    一个建议-可能是Adapter pattern

    一个非泛型接口我多次从一个泛型类型继承,每次都有不同的类型参数。我从 I 继承的唯一原因是为了声明重载

    我也将它与 一起使用。它有助于将一个类的接口转换为另一个接口,即期望。 Adapter 可以让那些因为接口不兼容而无法协同工作的类一起工作。

    老实说,在您的情况下,我不知道在非泛型接口I 中实现了什么概念,但我想这是因为在调用用于存储对象的泛型方法时,偶尔会有需求以不同方式处理特定类型

    【讨论】:

    • 它确实看起来像一个适配器模式
    【解决方案2】:

    我认为它没有名字。经典模式集主要基于旧 Java 和预标准化 C++ 中的代码,它们都不支持参数多态性(模板/泛型),因此需要它们的模式并没有真正出现。就 GoF 而言,这只是继承自三个不同的接口。

    它也有点太丑了,不能作为一种模式。为什么只有这三种类型?为什么不是 Int16 或 Uint32?为什么是接口泛型而不是方法?

    【讨论】:

    • 回答您的问题:示例只是示例,可以添加或删除更多数据类型。接口是泛型的而不是方法,因为支持IOperations&lt;T&gt; 中的操作的类型数量固定,而IOperations&lt;T&gt; 从未被引用,只使用Combined。这样做的唯一原因是重复方法声明和 XML 文档。 (实现Combined的类分别实现了所有方法)。
    猜你喜欢
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 2011-01-02
    • 2016-06-17
    相关资源
    最近更新 更多