提问人:Rob Sobers 提问时间:10/27/2008 更新时间:10/27/2008 访问量:460
此属性是否应成为对象接口的一部分?
Should this property be part of my object's interface?
问:
我有一个名为“IsSecureConnection”的属性,它是我的对象接口的一部分。这对于接口的大多数实现都是有意义的,但是,在某些实现中,我想将属性设置为 ReadOnly。
我是否应该从对象的接口中省略此属性,即使所有实现都需要它(尽管有时略有不同)?
谢谢!
答:
只需在界面中添加 getter。
public interface Foo{
bool MyMinimallyReadOnlyPropertyThatCanAlsoBeReadWrite {get;}
}
接口指定对象必须实现的最小值;它没有说一个对象不能做什么。为此,您需要考虑创建基类。
接口就像盐一样:到处撒:
public interface ICanBeSecure
{
bool IsSecureConnection { get; }
}
public interface IIsSecureable : ICanBeSecure
{
bool IsSecureConnection { get; set;}
}
评论
您需要评估案例。如果让它始终可写没有意义,请将其分离到第二个接口中。
public interface IFoo {
bool SecuredConnection{ get; }
}
public interface ISecurableOptionFoo: IFoo {
bool SecuredConnection{ get; set; }
}
评论
这实际上取决于什么对你的客户来说最容易读。我能想到几个选择:
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 有同样的问题,但没有麻烦的 new/shadows 诡计。但是,如果某些客户端需要安全连接,那么这个(或 2)可能是要走的路 - 否则,你不能真正使用类型安全来强制实施安全连接。
4,虽然有效的设计IMO(有些人会不同意 - 参见对IO的反应。Stream)很容易让客户出错。如果 90% 的实现者是安全的,则很容易不检查 SupportsSecureConnection。如果 IsSecureConnection = true 调用不受支持,则实现者还可以选择引发异常或丢弃该调用,这要求客户端捕获并检查 IsSecureConnection 的新值。
评论