Как перегрузить виртуальную функцию, введенную в родительский класс?

У меня есть родительский класс с одной важной абстрактной процедурой, которую я перегружаю во многих дочерних классах, как показано ниже:

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

end;

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

теперь мне нужно (перегрузить) эту процедуру другой процедурой SaveConfig, которая будет принимать параметры, но я не хочу вносить большие изменения в родительский класс, который может потребовать, чтобы я пошел и внес изменения во все другие дочерние классы.

есть ли способ перегрузить SaveConfig в этом конкретном ребенке класс без внесения больших изменений в родительский класс и другие дочерние классы, которые наследуются от него?

2 ответов


можно использовать 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, поэтому должно работать в нем и во всех более поздних версиях.)


поскольку вы не хотите вносить изменения в другие потомки, я бы предложил добавить необязательное поле в родительский класс для хранения параметров, тогда любой потомок, который хочет использовать параметры, может их использовать. Таким образом, вам не нужно менять подпись переопределенного 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;