该属性应该是我对象界面的一部分吗?

时间:2008-10-27 13:40:08

标签: vb.net oop interface object

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

我是否应该从对象的界面中省略这个属性,即使所有实现都需要它(虽然有时会略有不同)?

谢谢!

4 个答案:

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