9

以下に示すコード例のように、多くの子クラスでオーバーロードしている 1 つの重要な抽象プロシージャを持つ親クラスがあります。

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

end;

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

ここで、パラメーターを受け入れる別の SaveConfig プロシージャーでこのプロシージャーを (オーバーロード) する必要がありますが、他のすべての子クラスに変更を加える必要がある親クラスに大きな変更を加えたくありません。

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

4

2 に答える 2

13

を使用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;

(Delphi 7 でテストされているため、それ以降のすべてのバージョンで動作するはずです。)

于 2012-12-05T01:39:29.310 に答える
5

他の子孫に変更を加えたくないので、パラメータを保持するために親クラスにオプションのフィールドを追加することをお勧めします。そうすれば、パラメータを使用したい子孫はそれらを使用できます。そうすれば、オーバーライドされたの署名を変更する必要はありません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;
于 2012-12-05T02:55:27.017 に答える