3

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

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

谢谢!

4

4 回答 4

6

只需在界面中添加getter。

public interface Foo{
  bool MyMinimallyReadOnlyPropertyThatCanAlsoBeReadWrite {get;}
}

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

于 2008-10-27T13:42:10.820 回答
5

接口就像盐:到处撒盐:

public interface ICanBeSecure
{
    bool IsSecureConnection { get; }
}

public interface IIsSecureable : ICanBeSecure
{
    bool IsSecureConnection { get; set;}
}
于 2008-10-27T13:44:39.647 回答
3

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

public interface IFoo {
   bool SecuredConnection{ get; }
}

public interface ISecurableOptionFoo: IFoo {
   bool SecuredConnection{ get; set; }
}
于 2008-10-27T13:45:55.680 回答
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 的新值。

于 2008-10-27T14:18:18.097 回答