2011年11月26日土曜日

DELPHIでInterfaceを使ってみる(3)

DELPHIのInterfaceはクラスと同じように継承・派生することが可能です。

たとえば、エラ呼吸かどうかを確認するインターフェイスをITypeからの派生Interfaceとして作ります。
  IIsBranchial = interface(IType)
    function IsBranchial() : Boolean ; // True or False
  end;
前回までのクラスをIIsBranchialから派生するようにします。
  THuman = class(TNonRefInterfacedObject,IIsBranchial)
  public
    function GetTypeName() : string ; // human
    function IsBranchial() : Boolean ; // false
  end;

  TAnimal = class(TNonRefInterfacedObject,IIsBranchial)
  public
    function GetTypeName() : string ; // animal
    function IsBranchial() : Boolean ; // false
  end;

  TFish = class(TNonRefInterfacedObject,IIsBranchial)
  public
    function GetTypeName() : string ; // fish
    function IsBranchial() : Boolean ; // true
  end;
この場合、各クラスはITypeとIIsBranchial両方のInterfaceを実装している必要があります。実装が足らない場合、コンパイルエラーとなります。
また、IIsBranchialはITypeからの派生とはいえ、明示的に継承していないクラスからのキャストはできません。たとえば、上記THumanからITypeへはキャストできません。キャストが必要な場合は明示的に継承します。


THuman = class(TNonRefInterfacedObject,IIsBranchial,IType)


DELPHIにはチェック付きキャストとしてas演算子が用意されています。これはキャストが不正な場合、例外投げられるというものです。as演算子を用いてInterfaceにキャストする場合、このままでは実行時例外が投げられてしまいます。

キャストできるようにするにはInterfaceの宣言時にGUIDを追加してあげます。今回の場合、以下のようになります。
  IType = interface(IUnKnown)
  ['{5CDFEE96-1683-4A40-A490-34D064DCAA18}']
    function GetTypeName() : string ;
  end;

  IIsBranchial = interface(IType)
  ['{B034BE0E-4087-4C45-B78A-CCF6FB7BF9B5}']
    function IsBranchial() : Boolean ;
  end;
DELPHIではCtrl + Shift + Gで簡単に追加することができます。



  • インターフェースでの as 演算子の使い方





  • 次回ももう少しInterfaceを使ってみたいと思います。


    ソースコードは自由にご使用ください。ただし問題が起きても責任はとれません。

    0 件のコメント:

    コメントを投稿