インターフェイスのプロパティの作成
プロパティの作成:インデックス への移動
インターフェイスは、オブジェクトと同様に、published プロパティの値として使用することができます。ただし、そのインターフェイスの実装から送られた通知をコンポーネントが受け取るメカニズムは異なります。サブコンポーネントのプロパティの作成時には、プロパティの設定アクセサで、プロパティ値として代入されるコンポーネントの FreeNotification メソッドが呼び出されました。その結果、コンポーネントは、プロパティの値であるコンポーネントが解放されたときに、自分自身を更新することができました。しかし、プロパティの値がインターフェイスである場合には、そのインターフェイスを実装しているコンポーネントにアクセスすることができません。そのため、そのコンポーネントの FreeNotification メソッドを呼び出すことができません。
この状況には、コンポーネントの ReferenceInterface メソッドを呼び出して対処することができます。
procedure TDemoComponent.SetMyIntfProp(const Value: IMyInterface);
begin
ReferenceInterface(FIntfField, opRemove);
FIntfField := Value;
ReferenceInterface(FIntfField, opInsert);
end;
インターフェイスを指定して ReferenceInterface を呼び出すと、別のコンポーネントの FreeNotification メソッドを呼び出すのと同じ結果になります。そのため、プロパティの設定アクセサで ReferenceInterface を呼び出した後は、Notification メソッドをオーバーライドして、インターフェイスを実装しているコンポーネントから送られた通知を処理することができます。
procedure TDemoComponent.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited Notification(AComponent, Operation);
if (Assigned(MyIntfProp)) and (AComponent.IsImplementorOf(MyInftProp)) then
MyIntfProp := nil;
end;
Notification のコードでは、private フィールド(FIntfField)ではなく、MyIntfProp プロパティに nil を代入していることに注意してください。そうすると、Notification でプロパティの設定アクセサが呼び出され、その設定アクセサで ReferenceInterface が呼び出されて、以前にプロパティ値が設定されたときに確立された通知要求が削除されます。インターフェイス プロパティへの代入はすべて、プロパティ設定アクセサを通じて行わなければなりません。