[Delphi]後で宣言するインタフェイスorクラスを、先に宣言したクラスで使いたい

複数のオブジェクトがお互いを知っている、
ことが必要となる場合があります。

デザインパターンでは、何度か登場します。

インタフェイスが、お互いを知っている。
例えば、Stateなんかもそうなりますね。

そういった時には、前方宣言、を使います。

前方宣言は、

  • interface; 
  • class;
のように、メンバを宣言しないで、セミコロンで閉じます。
そして、後ろで、実際のメンバを再度宣言します。

以下はそのサンプルです

unit StateUnit ;

interface

  type
    // -------------------------------------------------------------------------
    IContext = interface ; // 前方宣言
    // -------------------------------------------------------------------------

    // ================================================
    // 下記2つのクラスは、お互いを引数とする
    //
    // 前方宣言をしないと、
    // 先に宣言した方の引数は未定義となってしまう
    // ================================================

    IState = interface// -------------------------------------------------------
      procedure DoClock( _context : IContext ; _hour : Integer ) ;
      // 前方宣言しないとIContextが未定義となる
      procedure DoUse( _context : IContext ) ;
      procedure DoAlarm( _context : IContext ) ;
      procedure DoPhone( _context : IContext ) ;
    end ;

    IContext = interface// -----------------------------------------------------

      procedure ChangeState( _state : IState ) ;
    end ;

implementation

end.