2012-01-10 6 views
4

VCLでのインターフェイスの使用に関する以前の調査を続けます。VCLクラスでのインターフェイスの使用方法 - パート2

How to implement identical methods with 2 and more Classes?

How to use Interface with VCL Classes?

私がどこでどのように二つが一緒に仕事を証明するためのコード例を持っていると思います。 または何2の古典的な利益/使い方です:

ISomething = interface 
['{EFE0308B-A85D-4DF3-889C-40FBC8FE84D0}'] 
... 
end; 

TSomeThing = class(TSomeVCLObject, ISomething) 
... 
end; 
+1

特定の質問をする必要があります。これは適切に編集しない限り、近い票を集める責任があります。 –

+0

私はそれを削除すべきですか? – ZigiZ

+1

あなたは明確に特定の質問を述べるべきだと思います。これは質問3であり、私はそれらのどれかが異なるとは確信していません。 –

答えて

5

あなたはTSomeThingTSomeThingElseクラスを持っているが、彼らは共通の祖先クラスを持っていない想像してみてください。つまり、それらを同じ関数に渡すことや、共通のメソッドを呼び出すことはできません。両方のクラスに共有インターフェイスを追加することで、両方を行うことができます。例:

type 
    ISomething = interface 
    ['{EFE0308B-A85D-4DF3-889C-40FBC8FE84D0}'] 
    public 
    procedure DoSomething; 
    end; 

    TSomeThing = class(TSomeVCLObject, ISomething) 
    ... 
    procedure DoSomething; 
    end; 

    TSomeThingElse = class(TSomeOtherVCLObject, ISomething) 
    ... 
    procedure DoSomething; 
    end; 

procedure TSomeThing.DoSomething; 
begin 
    ... 
end; 

procedure TSomeThingElse.DoSomething; 
begin 
    ... 
end; 

procedure DoSomething(Intf: ISomething); 
begin 
    Intf.DoSomething; 
end; 

procedure Test; 
var 
    O1: TSomeThing; 
    O2: TSomeThingElse; 
    Intf: ISomething; 
begin 
    O1 := TSomeThing.Create(nil); 
    O2 := TSomeThingElse.Create(nil); 
    ... 
    if Supports(O1, ISomething, Intf) then 
    begin 
    Intf.DoSomething; 
    DoSomething(Intf); 
    end; 
    if Supports(O2, ISomething, Intf) then 
    begin 
    Intf.DoSomething; 
    DoSomething(Intf); 
    end; 
    ... 
    O1.Free; 
    O2.Free; 
end; 
+1

これまでの質問はすべて、実装継承に関するものでしたが、最終的に単一の共通祖先 –

+0

から派生していないときは、Delphiでは不可能です。 2番目の 'Supports(O1、ISomething、Intf)'が 'O2' noでなければなりませんか? – ZigiZ

+2

David、以前の質問で私はInterfaceを使用することは役に立たないことに気付きました。あなたが投稿したコードは非常に良いですが、それは私が今日使用しているコードの多くです。私はそれが別の(インターフェイスが示唆された)行うことができることを望んでいたが、私はちょうどそれをいつ、どのように使用するのか分かりませんでした。 10x – ZigiZ

関連する問題