3

インターフェイスの実装に前提条件を追加できないことを理解しています。インターフェイスから見える要素のコントラクトを定義するコントラクト クラスを作成する必要があります。

しかし、次のケースでは、インターフェイス定義レベルでは不明な実装の内部状態にコントラクトを追加するにはどうすればよいでしょうか?

[ContractClass(typeof(IFooContract))]
interface IFoo
{
  void Do(IBar bar);
}

[ContractClassFor(typeof(IFoo))]
sealed class IFooContract : IFoo
{
  void IFoo.Do(IBar bar)
  {
    Contract.Require (bar != null);

    // ERROR: unknown property
    //Contract.Require (MyState != null);
  }
}

class Foo : IFoo
{
  // The internal state that must not be null when Do(bar) is called.
  public object MyState { get; set; }

  void IFoo.Do(IBar bar)
  {
    // ERROR: cannot add precondition
    //Contract.Require (MyState != null);

    <...>
  }
}
4

1 に答える 1

3

IFooできません - その事後条件はで宣言されていないため、 のすべての実装に適しているわけではありませんIFoo。インターフェイス (またはそれが拡張する他のインターフェイス) のメンバーのみを参照できます。

Fooただし、前提条件( ) ではなく事後条件( )を追加しているため、追加できるはずです。EnsuresRequires

実装固有の前提条件を追加することはできません。これは、呼び出し元が契約に違反するかどうかを知ることができないためです。

public void DoSomething(IFoo foo)
{
    // Is this valid or not? I have no way of telling.
    foo.Do(bar);
}

基本的に、コントラクトは発信者にとって「不公平」であってはなりません - 発信者が前提条件に違反した場合、それは予測できなかったものではなく、常にバグを示すべきです。

于 2009-09-06T11:53:05.983 に答える