2012-12-05 7 views
6

私は、以下に示すサンプルコードとして、多くの子クラスでオーバーロードしています一つの重要な抽象手順で親クラスを持っている:私はその意志別saveconfigの手順で(過負荷)には、この手順を必要とする今そこに親クラスに導入された仮想関数をどのようにオーバーロードしますか?

TCParent = Class 
private 
public 
procedure SaveConfig; virtual; abstract; 

end; 

TCChild = Class(TCParent) 
private 
public 
procedure SaveConfig; override; 
end; 

パラメータを受け入れますが、親クラスに大きな変更を加えたくないので、他のすべての子クラスに変更を加える必要があります。

この特定の子クラスにSaveConfigをオーバーロードする方法はありますか?親クラスとそれを継承する他の子クラスに大きな変更を加えないでください。

+3

なぜこの新しい 'SaveConfig'は同じ名前を持つ必要がありますか?それを何か他のものと呼んでみませんか? – awmross

+1

@awmrossなぜなら、 'Int64'オフセットをとる' TStream.Seek'にオーバーロードを追加したいからです。質問を例と混同しないでください。ラインにポインティング前の宣言 から「saveconfigの」異なりの宣言: [エラー] uClassChild.pas(13):残念ながら、私は、私はエラーを得た上記のコードをコンパイルしようとしたので、ときデルファイ7 :(使用しています –

答えて

9

reintroduceを使用すると、新しいオーバーロードされたメソッドを追加できます。子クラスのreintroduce; overload;の順番が必要であることに注意してください。それらを逆にすると、コードはコンパイルされません。

TCParent = Class 
private 
public 
procedure SaveConfig; virtual; abstract; 
end; 

TCChild = Class(TCParent) 
private 
public 
procedure SaveConfig; overload; override; 
procedure SaveConfig(const FileName: string); reintroduce; overload; 
end; 

(デルファイ7でテストされ、それ以降のすべてのバージョンで動作するはずです。)

+0

プロシージャSaveConfig(const FileName:string);再導入;上書き; – MChan

+0

あなたは運が悪いです.AFAIK、D7で同じことを行う方法はありません。(なぜ、彼らは新しい命令 'reintroduce'を導入しました) ) –

+1

しかし、Delphi 7では再導入が行われていますが、上記のproc定義ではコンパイルできません。具体的には、D7はこの特定の定義で再導入を受け入れませんが、通常は他の定義で受け入れます。 – MChan

4

あなたが他の子孫に変更を加えたくないので、私は親にオプションのフィールドを追加することをお勧めクラスを使用してパラメータを保持すると、パラメータを使用する任意の子孫がそれらを使用できます。そうすれば、オーバーライドされたSaveConfig()のシグネチャを変更する必要はありません。たとえば、

type 
    TCParent = class 
    protected 
    SaveConfigParams: TStrings; // or whatever... 
    public 
    procedure SaveConfig; overload; virtual; abstract; 
    procedure SaveConfig(Params: TStrings); overload; 
    end; 

procedure TCParent.SaveConfig(Params: TStrings); 
begin 
    SaveConfigParams := Params; 
    try 
    SaveConfig; 
    finally 
    SaveConfigParams := nil; 
    end; 
end; 

です。

type 
    TCChild = class(TCParent) 
    public 
    procedure SaveConfig; override; 
    end; 

procedure TCChild.SaveConfig; 
begin 
    if SaveConfigParams <> nil then 
    begin 
    // do something that uses the parameters... 
    end else begin 
    // do something else... 
    end; 
end; 

type 
    TCChild2 = class(TCParent) 
    public 
    procedure SaveConfig; override; 
    end; 

procedure TCChild2.SaveConfig; 
begin 
    // do something, ignoring the SaveConfigParams... 
end; 
+0

助けてくれてありがとうございますが、私はこの部分をはっきりと理解していません....私はあなたを正しく理解していることを確認するために...あなたは、 IF文のSaveConfigParams IF文の下でコードを実行します....これが正しければ、親クラスのパラメータ設定されたSaveConfigプロシージャの必要性は何ですか? – MChan

+1

子クラスは、必要に応じてパラメータが指定されているかどうかをオプションでチェックできます。検出された場合はそれに応じて動作を調整し、それ以外の場合は無視します。それは要点です。パラメータはオプションですが、必要に応じて各子供が見ることができる親に保存されます。これは最初に求められていたものです。どこでも変更を加えることなくパラメータをサポートします。最終的には、弾丸を噛むだけで、 'SaveConfig()'を変更してオプションの入力パラメータを与え、すべての子にその変更を加えることです。あなたのコードはより洗練されたものになります。 –

関連する問題