Как перегрузить виртуальную функцию, введенную в родительский класс?
У меня есть родительский класс с одной важной абстрактной процедурой, которую я перегружаю во многих дочерних классах, как показано ниже:
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;