簡體   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