繁体   English   中英

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

[英]Wrapping C# classes to use with polymorphism through a common interface

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

  • Person.Name
  • 产品名称
  • Order.Name

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

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

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

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

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

那么NamedObject有什么问题?

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

从字面上说它是什么,没有更少,仅此而已。

我坚持使用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好处是,当属性的值在目标对象上发生变化时,它也会在NamedEntity引用中通过Func更改,这意味着在对象的生命周期内,您可以将它们包装一次。 您也可以使用Func来设置值和get,并且可以调整更多属性。

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

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

从技术上讲,我认为最正确的名称是Adapter,请看这个问题。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM