2013-02-18 81 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的問題。當你有一個抽象接口

適配器使用,並且要將該接口映射到另一個對象,它具有類似的功能作用,但不同的接口。

您沒有抽象接口,而是「類似的功能角色,但接口不同」。