1

たとえば、すでにどこかで定義されているクラスをオーバーライドしSystem.Classes.TOriginalClass、元のクラス名を保持したいとします。私はそれを次のように定義する必要があることを知っています:

type
  TOriginalClass = class(System.Classes.TOriginalClass)
  ...
  end;

このカスタムオーバーライドされたクラスを、それが宣言されたのと同じユニット内に実装したい場合、それを使用したいすべての場所がこのクラスを宣言した場所の下にある限り、問題はありません。

しかし、この置換クラスを別のユニットで使用したいとします。System.Classesは非常に一般的なユニットであり、他のほとんどすべてのユニットで使用されています。System.Classesユニットと、このオーバーライドされたバージョンを作成したユニットの両方を使用できるようにしたいので、それを呼び出しましょうMyClasses

他のユニットでは、次のように、宣言に完全なユニット/クラスを含めることでこれを達成できることを知っています。

type
  TMyClass = class(MyClasses.TOriginalClass)
  ...
  end;

しかし、それは目的全体をかなり無効にします。なぜならMyClasses.、の前に接頭辞として含めることを余儀なくされるからTOriginalClassです。TOriginalClass私がやりたいのは、最初に宣言された場所を気にする必要がなく、このように宣言することです...

type
  TMyClass = class(TOriginalClass)
  ...
  end;

...それがの代わりにTMyClass継承されることを確認しながら。MyClasses.TOriginalClassSystem.Classes.TOriginalClass

これは、uses句でこれら2つのユニットのそれぞれを宣言する順序で構成されていると確信しています。たとえば、を使用System.Classesする前にを使用しMyClassesます。しかし、これは可能であると思われますか?これを行うとき、私は何に注意する必要がありますか?

PS-TOriginalClass私は実際のクラスではないことを知っています。最初にで宣言されたクラスを示すためSystem.Classesにそれを使用しています。同じことが、どのユニットのどの元のクラスにも当てはまります。

4

1 に答える 1

5

あなたはすでに答えを出しました。

MyClasses.TOriginalClassはい、 を指定するだけでから派生させることができますが、 がよりもリストの後ろに来るか、がリストから完全に省略されてTOriginalClassいる必要があります。他に方法はありません、ごめんなさい。MyClassesusesSystem.ClassesSystem.Classesuses

を修飾しない場合TOriginalClass、コンパイラは遭遇した「最後の」宣言を使用します。最も派生したものを自動的に使用することはありません。

ごめん。

于 2012-07-07T02:46:15.960 に答える