2011-06-21 25 views
3

列表泛型設計模式,我有一個列類:舉辦不同類型

class Column<T> where T : IComparable, IConvertible 
{ 
    private List<T> _records; 
    ... 
} 

,並應持有不同的數據類型的多列的表類。

class Table 
{ 
    private List<Column> columns; 
    ... 
} 

很明顯,這不會編譯,但我是在處理這個想法的標準設計模式。

任何想法?

+1

所以基本上你要找的是沒有類型安全的類型安全? –

+0

你是什麼意思,它不會編譯? –

回答

6

你可以使用一個通用的,非通用基類或接口:

// or maybe interface IColumn instead, depending on your needs 
class Column 
{ 
    // any non-generic stuff common to all columns 
} 

class Column<T> : Column where T : IComparable, IConvertible 
{ 
    // any generic stuff specific to Column<T> 
} 

class Table 
{ 
    private List<Column> _columns; 
} 
+0

太棒了!我在標準庫中看到了這個,但我不知道它的含義。謝謝。 –

0

唯一的情況下,我可以看到,它會做你的描述會是什麼,如果一個人希望來存儲對象是有用的當一個類可能希望存儲的類(它們都做這兩件事)不共享一個共同的基類型時,它們都來自一個特定的類並實現一個特定的接口。例如,可能有一個由Foo,CloneableFoo(源自Foo並實現可複製接口),DerivedFoo(源自Foo,並且不實現克隆)的CloneableDerivedFoo(源自Foo並實施克隆),並且人們可能希望有一種方法可以接受任何允許克隆的Foo衍生物。請注意,集合中允許的唯一通用基本類型CloneableFoo和CloneableDerivedFoo是Foo,它不允許克隆。

該問題的一個解決方案是導出一個接口,其中的單個成員「self」是T類型的只讀屬性。任何接口IW可能要用於與另一個接口或基類聯合應該聲明一個通用表格IWither < out T >它繼承了非泛型形式,也是ISelf <T>。任何實現該風格的通用接口的類都應該以明顯的方式實現ISelf <ItsOwnClass>(僅返回本身)。

如果這樣做了,可以聲明一個實現使用實現ISelf的嵌套接口的接口的任意組合的對象,並且可以在沒有類型轉換的情況下使用任何類型的對象(通過使用適當數量的「.Self 「物業訪問者)。有趣的是,可以對任何實現一組這樣的接口的類進行類型轉換,以實現它們的任何嵌套組合。例如,IFoo的< IBAR < IBoz <WhateverDerived> > >可以強制轉換爲一個IBoz < IBAR <的IFoo <WhateverBase> > >。

相關問題