2010-10-14 43 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