2013-02-18 76 views
1

我有几个C#类,每个类都有相似的属性。 (他们是一个SDK的一部分,他们的代码不能改变。)通过通用接口包装C#类以使用多态性

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

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

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

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

+0

这看起来像是一个主观问题,你已经把它们叫做'包装'类。为什么不去那个? – Andorbal 2013-02-18 15:23:50

+0

我个人会和* Proxy *一起去,因为包装类被授权代表wrappee行事,即代表它。 – 2013-02-18 15:25:31

+1

我在我卖的框架中实现了这个'组合'模式,它实际上是所有不同类型的代理,其行为规定了在名称冲突的情况下会发生什么(如'名称')。当然也可以手动实现...也许这就是你要找的东西? – atlaste 2013-02-27 15:37:23

回答

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变化,这意味着该LiF内您可以用一次包装它们的物品的范围。你也可以与Func做相反的处理,它可以设定值并得到,并可以适应更多的属性。

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

3

(我不想使用动态鸭打字或即兴接口。)

那么NamedObject有什么问题?

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

它字面意思是它是什么,无外乎,仅此而已。

4

它看起来像适配器,因为你正在调整现有的接口到特定的要求。

+0

适配器对我来说并不完全正确,因为我没有真正从一个接口适应到另一个接口,而是使用通用接口封装了现有的相同名称的属性,以便类可以多形地使用。 – 2013-02-18 15:30:53

+1

@ChrisFulstow但这取决于接口的定义。在这种情况下,接口在暴露成员方面是相同的,但是在类型层次结构方面不同。 – 2013-02-18 15:44:28

+1

Adapter的定义:_将一个类的接口转换为客户端期望的另一个接口。适配器让类可以一起工作,否则就不能因为不兼容的接口。在这里,客户端需要一个不存在的通用接口。您必须创建该接口才能使不兼容的类一起工作。它符合我的想法。 – 2013-02-18 15:47:59

1

也许你可以改变命名空间并保留原始类的名称。

1

从技术上讲,我认为最正确的名称是Adapter,请参阅this的问题。当你有一个抽象接口

适配器使用,并且要将该接口映射到另一个对象,它具有类似的功能作用,但不同的接口。

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