2

我有几个 C# 类,每个类都具有相似的属性。(它们是 SDK 的一部分,不能更改它们的代码。)

  • 人名
  • 产品名称
  • 订单名称

我想多态地使用这些类,但它们没有实现公共接口或从公共基类派生,所以这是不可能的。为了解决这个问题,我想将每一个都包装在另一个实现公共接口的类中,并将每个类属性连接到其对应的接口属性。

包装类的合适名称是什么?包装器、装饰器、适配器、代理?这种模式有名字吗?有更好的方法吗?

(我不想使用动态鸭子打字或即兴界面。)

4

5 回答 5

4

它看起来像适配器,因为您正在使现有接口适应特定要求。

于 2013-02-18T15:24:25.133 回答
3

(我不想使用动态鸭子打字或即兴界面。)

那么 NamedObject 有什么问题呢?

public class NamedObject
{
    public string Name { get; set; }
}

它从字面上说明它是什么,仅此而已。

于 2013-02-18T15:23:59.263 回答
2

我会坚持 CodeCaster 的想法,也许Func<T> 除了我在不使用尖括号时出现戒断症状之外没有其他原因......

public class NamedEntity
{
    public string Name { get { return _getName(); } }

    private Func<string> _getName;

    public NamedObject(Func<string> getName)
    {
        _getName = getName;
    }
}

然后这样调用:

var named = new[] 
    { 
        new NamedEntity(() => person.Name),
        new NamedEntity(() => product.Name),
        new NamedEntity(() => order.Name)
    };

这样做的额外好处是,当目标对象上的属性值发生变化时,它NamedEntity也会通过 在引用中发生变化Func,这意味着在对象的生命周期内,您可以只包装一次。您还可以使用Func设置值和获取值的 s 进行逆操作,并且可以调整更多属性。

我不确定这代表什么模式(如果有的话),但我猜适配器模式(这是一种包装模式)。然而,它也可以被认为是一种代理模式。真的不确定。

于 2013-02-18T15:28:50.457 回答
1

也许您可以更改名称空间并保留原始类的名称。

于 2013-02-18T15:27:47.477 回答
1

从技术上讲,我认为最正确的名称是适配器,请参阅这个问题。

当您有一个抽象接口并且您希望将该接口映射到另一个具有相似功能但接口不同的对象时,将使用适配器。

您没有抽象接口,而是“类似的功能角色,但不同的接口”。

于 2013-02-18T15:31:06.593 回答