此属性是否应成为对象接口的一部分?

Should this property be part of my object's interface?

提问人:Rob Sobers 提问时间:10/27/2008 更新时间:10/27/2008 访问量:460

问:

我有一个名为“IsSecureConnection”的属性,它是我的对象接口的一部分。这对于接口的大多数实现都是有意义的,但是,在某些实现中,我想将属性设置为 ReadOnly。

我是否应该从对象的接口中省略此属性,即使所有实现都需要它(尽管有时略有不同)?

谢谢!

vb.net OOP 接口 对象

评论


答:

6赞 user1228 10/27/2008 #1

只需在界面中添加 getter。

public interface Foo{
  bool MyMinimallyReadOnlyPropertyThatCanAlsoBeReadWrite {get;}
}

接口指定对象必须实现的最小值;它没有说一个对象不能做什么。为此,您需要考虑创建基类。

5赞 James Curran 10/27/2008 #2

接口就像盐一样:到处撒:

public interface ICanBeSecure
{
    bool IsSecureConnection { get; }
}

public interface IIsSecureable : ICanBeSecure
{
    bool IsSecureConnection { get; set;}
}

评论

1赞 Newtopian 10/27/2008
小心硬化的动脉和更高的血压;-)
3赞 Chris Marasti-Georg 10/27/2008 #3

您需要评估案例。如果让它始终可写没有意义,请将其分离到第二个接口中。

public interface IFoo {
   bool SecuredConnection{ get; }
}

public interface ISecurableOptionFoo: IFoo {
   bool SecuredConnection{ get; set; }
}

评论

0赞 James Curran 10/27/2008
应使 ISecurableOptionFoo 继承自 IFoo,以便可以在任何需要 IFoo 的地方使用 ISecurableOptionFoo。
3赞 Mark Brackett 10/27/2008 #4

这实际上取决于什么对你的客户来说最容易读。我能想到几个选择:

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 的新值。