2010-10-14 69 views
3

考慮到以下設置,如何限制IConnection只包含中PortsIPort?也許我在這裏忽略了一些明顯的東西:接口和限制條件

Enum ConnectionType 
{ 
    Undefined, 
    Type1, 
    Type2 
} 


IConnection 
{ 
    ConnectionType ConnectionType {get;set} 
    IEnumerable<IPort> Ports {get;set;} 
} 

IPort 
{ 
    ConnectionType ConnectionType {get;set;} 
} 
+0

有什麼需要複製的信息?如果所有端口都需要相同的連接類型,爲什麼不僅爲整個端口集合保留一次? – 2010-10-14 09:04:51

回答

3

你不能在編譯時強制執行這樣的約束。

您將不得不在運行時進行一些檢查。

2

爲了控制IPorts的類型,您將需要更改該類,以便不會以可寫方式公開該列表。

使屬性爲只讀,返回一個新的ReadOnlyCollection以防止將任何類型的IPort添加到內部集合中。添加一個AddPort方法,只允許添加正確類型的IPort

+0

其實我已經這樣做了,問題中的代碼只是一個虛擬的問題。我只是在想,如果有可能強制類型檢查進入界面。 – Residuum 2010-10-15 11:01:33

0

而不是在IPort接口中具有連接類型,具有IConnection的屬性,例如,

IConnection 
{ 
    ConnectionType ConnectionType { get; } 
    IEnumerable<IPort> Ports { get; } 
} 

IPort 
{ 
    IConnection Connection { get; } 
} 

這些屬性的管理應該留給實施。

+1

這是否會造成類似的問題?確保所有端口指向的連接都是該端口所屬的連接? – 2010-10-14 10:26:37

+0

我想,但它確實強制IPort實例可以連接到的ConnectionType與IConnection接口設置爲相同的ConnectionType。 – 2010-10-14 11:33:32

2

如何包裝枚舉和使用泛型?

public interface IConnectionType 
{ 
    ConnectionTypeEnum Connection{ get; set;} 
} 

public enum ConnectionTypeEnum 
{ 
    Undefined, 
    Type1, 
    Type2 
} 

public interface IPort<T> where T : IConnectionType 
{ 
} 

public interface IConnection<T> where T : IConnectionType 
{ 
    IEnumerable<IPort<T>> Ports {get;set;} 
} 

我不知道是否有任何點在具有枚舉了,雖然

+0

儘管對於我的問題中的簡單示例來說這是一個可行的答案,但如果我試圖在界面中進一步加以限制,它將無法正常工作。 – Residuum 2010-10-16 10:06:01