たとえば、エラ呼吸かどうかを確認するインターフェイスを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で簡単に追加することができます。
次回ももう少しInterfaceを使ってみたいと思います。
ソースコードは自由にご使用ください。ただし問題が起きても責任はとれません。
0 件のコメント:
コメントを投稿