我有一个名为“IsSecureConnection”的属性,它是我对象界面的一部分。这对于接口的大多数实现都是有意义的,但是,在某些实现中,我想使属性ReadOnly。
我是否应该从对象的界面中省略这个属性,即使所有实现都需要它(虽然有时会略有不同)?
谢谢!
答案 0 :(得分:6)
只需在界面中添加getter。
public interface Foo{
bool MyMinimallyReadOnlyPropertyThatCanAlsoBeReadWrite {get;}
}
接口指定对象必须实现的最小值;它没有说明对象不能做什么。为此,您需要研究创建基类。
答案 1 :(得分:5)
界面就像盐:洒在各处:
public interface ICanBeSecure
{
bool IsSecureConnection { get; }
}
public interface IIsSecureable : ICanBeSecure
{
bool IsSecureConnection { get; set;}
}
答案 2 :(得分:3)
您需要评估案例。如果让它始终可写是没有意义的,那么将它分成第二个接口。
public interface IFoo {
bool SecuredConnection{ get; }
}
public interface ISecurableOptionFoo: IFoo {
bool SecuredConnection{ get; set; }
}
答案 3 :(得分:3)
这实际上取决于您的客户最可读的内容。我可以想到几个选项:
1)继承的接口,虽然我不是隐藏的粉丝,但我认为这对任何VB.NET或显式客户端实现都有点难看:
interface IObject {
bool IsSecureConnection { get; }
// ... other interface definitions //
}
interface ISecurableObject : IObject {
new bool IsSecureConnection { get; set; }
}
2)使用继承的接口从属性中拆分集合:
interface IObject {
bool IsSecureConnection { get; }
// ... other interface definitions //
}
interface ISecurableObject : IObject {
void SetConnectionSecurity(bool isSecure);
}
3)将语义更改为尝试并获取安全连接,实现者可以自由地返回false:
interface ISecurable {
bool IsSecureConnection { get; }
bool TrySecureConnection();
}
4)添加额外的检查属性:
interface ISecurable {
bool IsSecureConnection { get; set; }
bool SupportsSecureConnection { get; }
}
所有这些都是IMO针对特定情况的有效设计。由于我没有关于用例的任何信息,除了几乎所有的时间都可以建立安全连接 - 我可能会投票给3.它很容易实现,客户端只有1个代码路径,并且有没有异常机制(这是另一种形式的耦合)。您确实存在客户没有检查TrySecureConnection返回的危险,但我认为它比其他选择的问题少。
如果客户更喜欢安全连接,但不需要 - 那么1的缺点是需要重载或客户端检查他们的IObject是否真的一个ISecurableObject。两者都有点难看。 2有同样的问题,但没有麻烦的新/阴影技巧。但是,如果某些客户端需要安全连接,那么这个(或2)可能就是这样 - 否则,您无法真正使用类型安全来强制执行安全连接。
4,虽然有效的设计IMO(有些人不同意 - 看到对IO.Stream的反应)很容易让客户弄错。如果90%的实施者都是安全的,那么很容易不检查SupportsSecureConnection。还有一个实现者选择抛出异常或丢弃IsSecureConnection = true调用(如果它不受支持),要求客户端捕获并检查IsSecureConnection的新值。