2009-02-26 7 views
3

私からのさらに別のTFrame IDE登録コンポーネントに関する質問です。すべての助け、仲間のプログラマーに感謝します。TFrameの継承リファクタリング

細目:

基本的に、私は私がIDEに登録したTFrameのベースのコンポーネントを持っており、それは素晴らしい仕事をしている:DarrianのTFrameの継承提案hereで遊ん)

。私は現在、既存のコンポーネントの非ビジュアルな機能とプロパティの大部分を共有するいくつかの "姉妹"コンポーネントを開発しています。それで、多くのものを親/スーパークラスに移動して、新しいコンポーネントと古いコンポーネントの両方を継承することは意味があります。

TFrameの継承をこのように「リファクタリングする」ための最良の方法は何ですか? (これはTFormクラスの子孫にも当てはまるかもしれませんが)。注意すべき点と注意点は何ですか?

例:私が試した

、例えば、その上に何もない、新しいのTFrameを作成し、そのフレームTMyBaseFrameを呼び出します。その後、既存のコンポーネントのクラス定義を修正して(それをTMyFrameTreeViewと呼ぶ)、TFrameではなく継承するようにしました。

これはうまくコンパイルされましたが、フォームにドロップしようとすると「ClientHeight not found」(または「ClientHeightプロパティが見つかりません」)が表示され、フォームにドロップされませんでした。関連するDFMからClientHeightとClientWidthを削除すると、やはりサイズ変更時に置き換えられてしまいました。私は子孫クラスでExplicitHeightとExplicitWidthに気付き、継承された値からのプロパティ値のオーバーライドに関係していると思っていますが、わかりません。 New - > Inherited Itemsを介してまったく新しいフレームを再作成し、すべてをコピーしてもまだ大きな結果は得られていません。

最後の注意

私は私が全体的な「ものを求めている理由の一部である....など、これはストリーミングDFMファイルと子孫の複数世代で、すぐに散らかっ得ることができます実現"概念的な側面を見ているだけでなく、具体的な現実世界にもの問題のバージョンを与える(私にはそう思われる、実行可能でなければならない)。

私は学習の試みをハックするための小さなテストパッケージを作成しましたが、多大な学習をしていますが、遅いですし、Delphi "Jedi Masters"のガイダンス/ 。 :)



回答アップデート以降:

以下の回答の両方が有用でした。同様に、通常のTFrameからの変更がない「ベースフレームクラス」を作成し、プロパティ、メソッドなどを追加する前にそれを継承して継承ストリーミングを安定化させるように思われます。理由は分かりませんが、これまでのところあります。 TMyBaseFrameinheritedobjectからTMyFrameTreeViewためのDFMファイルの最初の単語を変更するTMyFrameTreeViewの基本クラスを変更することに加えて

答えて

8

3

私は今、いくつかの「姉妹」既存のコンポーネントの 非視覚的な機能性と プロパティの偉大 契約を共有する コンポーネントを開発しています。それで、 を多くの部分を 親/スーパークラスに移動すると、新しい と古いコンポーネントの両方が から継承できます。

"リファクタリング"するにはどうすればいいですか このようにしてTFrameの継承を行うにはどうすればよいですか?

上記のテキストの要点は、おそらく "コンポーネントの非表示の機能"です。ですから、この場合、IMHOでは、ビジュアルレイヤーと非ビジュアルレイヤーを分けることが最善です。あなたのアプローチを使用したい場合は、

var 
TMyFrame1 = class(TFrame) 
... 
FDecorator: TMySharedEngine; 
    ... 
    public 
    property MySharedPart: TMySharedEngine read FDecorator; 
    constructor Create(AOwner: TComponent); override; 
    ... 
end; 

constructor TMyFrame1.(AOwner: TComponent); override; 
begin 
    inherited; 
    FDecorator:=TMySharedEngine.Create; //ok, ok do not forget to Free it .Destroy 
    FDecorator.LinkedFrame:=Self; 
    ... 
end; 

大藤:

TMySharedEngine = class(Whatever) 
property LinkedFrame: TFrame; 
property P1; 
property P2; 
... 
procedure Proc1; 
procedure Proc2; 
... //etc. 
end; 

とあなたの姉妹」フレームで

はそれのインスタンスを使用するには:

ので、おそらくそれはデコレータを使用することをお勧めしますTBaseFrame、TChildFrame1、TChildFrame2などのIDEフレームを使用して作成することができます。次に、TChildFrame1のユニットに移動し、次のように変更します。それはTChildFrame1 =クラス(TFrame)からTChildFrame1 =クラス(TBaseFrame)。コンパイル。それは動作するはずです。しかし、小さなトリック(フィーチャの衝突など)を避けるために、このトリックTBaseFrameを空にするときには、この方法をお勧めします(フィーチャの衝突など)

HTH。

+0

これまでのところ、「TBaseFrameを完全に空にする」ことは、ほとんど問題を避けるための鍵です。また、DFMファイルが、後のクラスで「オブジェクト」ではなく「継承」で始まることを確認します。あなたのデコレータのアイデアについても考えています - それに感謝します! – Jamo

+0

"TBaseFrameを完全に空にしておくことは、ほとんど問題を回避するための鍵です" - そうです。これは「設計上」(IOWは変わらない)であることを覚えておいてください。デルファイは柔軟になっていなければなりません。だから私が言ったように安全です。 –

+0

あなたのアイデアをありがとう:上記のデコレータアプローチなど – Jamo