gpt4 book ai didi

Delphi:我应该使用重载,重新引入+重载还是不使用?

转载 作者:行者123 更新时间:2023-12-03 15:39:11 24 4
gpt4 key购买 nike

基类中有一个虚拟方法,在子类中被重写。

但是,我需要在子类方法中添加一个新参数,并且无法使用“覆盖”声明,因为参数不同。

示例:

type
TFruit = class(TObject)
public
constructor Create; virtual;
end;

TApple = class(TFruit)
public
constructor Create(Color: TColor); override; // Error: Declaration of 'Create' differs from previous declaration
end;

我知道在这种情况下,一个好的做法是使用另一个名称创建一个新方法,但很多代码都是多余的。这个新参数只会影响几行...

然后我想到了使用“overload”,但是后来我不能同时使用“override”。那么我想问:只使用“重载”有什么问题吗? (Delphi 显示警告:方法“Create”隐藏基类型“TFruit”的虚拟方法)

我还检查了重新引入+重载的使用(以隐藏上面的警告),但我也看到了关于这种做法的不好的建议。你觉得怎么样?

最后,如果我不使用它们中的任何一个,只是删除子类方法中的“覆盖”并添加新参数怎么办? (这给了我同样的警告)

有人对我在这种情况下应该做什么以保持良好做法有任何建议吗?

type
TFruit = class(TObject)
public
constructor Create; virtual;
end;

TApple = class(TFruit)
public
constructor Create; override;

// What should I do:
// constructor Create(Color: TColor); overload; // Shows a warning
// constructor Create(Color: TColor); reintroduce; overload; // Hides the warning
// constructor Create(Color: TColor); // Shows a warning
// Other solution?
end;

谢谢!

最佳答案

Delphi 中的构造函数不必命名 Create() 。您可以将它们命名为任何您想要的名称。因此,如果您需要引入一个新参数,并且它只影响几行代码,我建议创建一个全新的构造函数:

type
TFruit = class(TObject)
public
constructor Create; virtual;
end;

TApple = class(TFruit)
public
constructor CreateWithColor(Color: TColor);
end;

constructor TApple.CreateWithColor(Color: TColor);
begin
inherited Create;
// use Color as needed...
end;

您的大部分代码仍然可以调用 TApple.Create() ,少数受影响的线路可以调用 TApple.CreateWithColor()相反。

否则,请使用reintroduce如果您必须维护 Create()名称,并给它一个默认参数,以便现有代码仍然可以编译:

type
TFruit = class(TObject)
public
constructor Create; virtual;
end;

TApple = class(TFruit)
public
constructor Create(Color: TColor = clNone); reintroduce;
end;

constructor TApple.Create(Color: TColor);
begin
inherited Create;
// use Color as needed...
end;

只要知道无论哪种方式,如果您使用 class of TFruit 创建派生对象实例,元类(这是 virtual 构造函数的常见原因),您将无法调用自定义 TApple构造函数:

type
TFruit = class(TObject)
public
constructor Create; virtual;
end;
TFruitClass = class of TFruit;

TApple = class(TFruit)
public
constructor Create(Color: TColor = clNone); reintroduce;
// constructor CreateWithColor(Color: TColor);
end;

var
Fruit: TFruit;
Cls: TFruitClass;
begin
Cls := TApple;
Fruit := Cls.Create; // calls TFruit.Create() since it is not overridden in TApple...
//...
end;

关于Delphi:我应该使用重载,重新引入+重载还是不使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28819520/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com