相关疑难解决方法(0)

Delphi:理解构造函数

我希望了解

  • 虚拟
  • 覆盖
  • 超载
  • 重新引入

当应用于对象构造函数时.每次我随机添加关键字直到编译器关闭 - 并且(在使用Delphi开发12年之后)我宁愿知道我在做什么,而不是随意尝试.

给出一组假设的对象:

TComputer = class(TObject)
public
    constructor Create(Cup: Integer); virtual;
end;

TCellPhone = class(TComputer)
public
    constructor Create(Cup: Integer; Teapot: string); virtual;
end;

TiPhone = class(TCellPhone)
public
    constructor Create(Cup: Integer); override;
    constructor Create(Cup: Integer; Teapot: string); override;
end;
Run Code Online (Sandbox Code Playgroud)

我希望它们表现的方式可能从声明中可以明显看出,但是:

  • TComputer 有简单的构造函数,后代可以覆盖它
  • TCellPhone 有一个替代构造函数,后代可以覆盖它
  • TiPhone 覆盖两个构造函数,调用每个构造函数的继承版本

现在该代码无法编译.我想明白为什么它不起作用.我也想了解覆盖构造函数的正确方法.或许你永远不能覆盖构造函数?或者覆盖构造函数是完全可以接受的?也许你永远不应该有多个构造函数,也许完全可以接受多个构造函数.

我想了解原因.修复它会很明显.

也可以看看

编辑:我也期待获得的订单上的推理virtual,override,overload,reintroduce.因为在尝试关键字的所有组合时,组合的数量会爆炸:

  • 虚拟; 超载;
  • 虚拟; 覆盖;
  • 覆盖; 超载;
  • 覆盖; 虚拟; …

delphi constructor delphi-5 constructor-chaining

34
推荐指数
2
解决办法
2万
查看次数

Delphi:如何隐藏祖先构造函数?

更新:用一个更简单的例子来解决问题,原来接受的答案没有回答

鉴于以下类及其祖先:

TComputer = class(TObject)
public
   constructor Create(Teapot: string='');
end;

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer); overload; virtual;
   constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
Run Code Online (Sandbox Code Playgroud)

现在TCellPhone有3个构造函数可见:

  • 杯子:整数
  • 杯子:整数; 茶壶:串
  • 茶壶:string =''

我该怎么做才能TCellPhone使祖先构造函数(Teapot: string = '')不可见,只留下声明的构造函数:

  • 杯子:整数
  • 杯子:整数; 茶壶:串

注:通常简单的行为有一个后代的构造函数隐藏了祖先:

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer); virtual;
end;
Run Code Online (Sandbox Code Playgroud)
  • 杯子:整数

如果你想保留祖先构造函数和后代,你可以将后代标记为overload:

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer); overload; virtual;
end;
Run Code Online (Sandbox Code Playgroud)
  • 杯子:整数
  • 茶壶:string =''

在这个问题的示例代码中,Delphi误解了我的 …

delphi constructor delphi-5 constructor-chaining

11
推荐指数
3
解决办法
4150
查看次数

德尔福:什么时候重新引入隐藏祖先,什么时候显示它们?

今天最近在Stackoverflow上我了解到:

我一直试图弄清楚这一切,所以这是另一个非常具体的问题,支持我处理构造函数的主要问题.


更新:替换了整个问题:

TComputer = class(TObject)
public
   constructor Create(Teapot: string='');
end;

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer); overload; virtual;
   constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;
Run Code Online (Sandbox Code Playgroud)

构建TCellPhone时,可以使用3个构造函数:

  • 杯子:整数
  • 杯子:整数; 茶壶:串
  • [茶壶:String ='']

问题:为什么constructor(Teapot: string='')不被隐藏?


现在我添加了第三个后代:

TComputer = class(TObject)
public
   constructor Create(Teapot: string='');
end;

TCellPhone = class(TComputer)
public
   constructor Create(Cup: Integer); overload; virtual;
   constructor Create(Cup: Integer; Teapot: string); overload; virtual;
end;

TiPhone = class(TCellPhone)
public
   constructor Create(Cup: …
Run Code Online (Sandbox Code Playgroud)

delphi constructor delphi-5 constructor-chaining

6
推荐指数
1
解决办法
3412
查看次数

"方法'%s'隐藏基类型'%s'的虚拟方法".真正被隐藏的是什么?

之后看了伊恩·博伊德的构造一系列问题(1,2,3,4),我知道我还是不太懂的什么东西被隐藏的字面含义.

我知道(纠正我,如果我错了)override唯一的目的是能够具有多态行为,以便运行时可以根据实例的实际类型解析方法 - 而不是声明的类型.请考虑以下代码:

type
  TBase = class
    procedure Proc1; virtual;
    procedure Proc2; virtual;
  end;

  TChild = class(TBase)
    procedure Proc1; override;
    procedure Proc2;            // <- [DCC Warning]
  end;

procedure TBase.Proc1;
begin
  Writeln('Base.Proc1');
end;
procedure TBase.Proc2;
begin
  Writeln('Base.Proc2');
end;

procedure TChild.Proc1;
begin
  inherited Proc1;
  Writeln('Child.Proc1');
end;
procedure TChild.Proc2;
begin
  inherited Proc2;
  Writeln('Child.Proc2');
end;

var
  Base: TBase;
begin
  Base := TChild.Create;
  Base.Proc1;
  Writeln;
  Base.Proc2;
  Base.Free;
  Readln;
end.
Run Code Online (Sandbox Code Playgroud)

哪个输出:

Base.Proc1
Child.Proc1 …

delphi overriding

6
推荐指数
1
解决办法
2361
查看次数