一部のクラス間の関係の実装に問題があります。私は、3 つの異なるフォームを提供する 3 つの異なるクラスを取得しました。これらのクラスはすべて同じ言語を話すため、 という同じクラスから継承されTAncestorServerます。TForm1Serverその子孫を 、TForm2Server、 と呼びましょうTForm3Server。TAncestorServerと呼ばれる抽象メソッドが含まれているFunction1ためTForm1、TForm2、TForm3から継承された独自のクラスを介して問題なく呼び出すことができ、 という名前のプロパティを介してクラスにアクセスできますServer。しかし、問題はTForm4!と呼ばれる別の形式に関するものです。他のフォームと非常に似ていますが、それらのように独立していません。TForm2Serverまたはで動作しTForm3Serverます。それでも問題はありませんが、Function2which が宣言されているTForm2Serverような別のメソッドを想像してみてくださいTForm3Server、TForm4それらを呼び出す必要があります。私はこのように行くことができます:
if Server is TForm2Server then
TForm2Server(Server).Function2
else if Server is TForm3Server then
TForm3Server(Server).Function2;
しかし、それは無限の if-else 句になる可能性があります! したがって、多重継承のようなものがここで役立つかもしれないと思いました。IForm4Serverを含むというインターフェイスを宣言しましたFunction2。したがってTForm2Server、 との両方からTForm3Server継承します。私はこのようなものがうまくいくと思った:TAncestorServerIForm4Server
If Server is IForm4Server then
IForm4Server(Server).Function2;
しかし、コンパイラはそうではないと考えています。 TAncestorServeris notIForm4Serverであるため、有効な型キャストではないと言います。これは絶対に正しいです。TForm1Server実装について何も考えておらずFunction2、空白のままにしておく必要があります。は膨大な数のメソッドとプロパティを表すため、TForm4.Server同様に宣言することはできませんが、への型キャストはまだできません。IForm4ServerFunction1IForm4ServerTAncestorServer
TForm4解決策として、2 つの異なるプロパティを同様GeneralServer: TAncestorServerに定義して、同じインスタンスまたはそれらForm4Server: IForm4Serverに割り当てることができますが、私はそれについて気分が良くありません。どうすればいいですか?そのための標準パターンはありますか?TForm2ServerTForm3Server