通过通用接口包装C#类以与多态性一起使用

时间:2013-02-18 15:21:19

标签: c# .net design-patterns polymorphism

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

  • Person.Name
  • Product.Name
  • Order.Name

我想以多态方式使用这些类,但它们不实现公共接口或派生自公共基类,因此这是不可能的。 为了解决这个问题,我想将每一个包装在另一个实现公共接口的类中,并将每个类属性连接到相应的接口属性。

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

(我不想使用动态鸭子打字或impromptu interface。)

5 个答案:

答案 0 :(得分:4)

它看起来像Adapter,因为您正在调整现有接口以满足特定要求。

答案 1 :(得分:3)

  

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

那么NamedObject有什么问题?

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

它确切地说它是什么,仅此而已,仅此而已。

答案 2 :(得分:2)

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

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更改,这意味着在对象的生命周期内可以躲开一次。您也可以使用设置值和get的Func进行反向,并且可以调整更多属性。

我不能立即确定这代表什么样的模式(如果有的话),虽然我会猜测适配器模式(这是一种包装模式)。但是,它也可以被认为是Proxy pattern。不确定。

答案 3 :(得分:1)

也许您只需更改命名空间并保留原始类的名称。

答案 4 :(得分:1)

从技术上讲,我认为最正确的名称是Adapter,请参阅this问题。

  

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

你没有抽象的界面,但是“类似的功能角色,但是不同的界面”。