delphi - Delphi构造函数如何(继承Parent.Parent创建)或(调用Parent.Parent.Create)
问题描述
嗨,我试图绕过 parent.create 有效地调用父母的 parent.create
这是一个例子
unit InheritedTest;
interface
type
IMyExample = interface
['{4B281573-99CC-4B9D-9895-F6BCD0E26F26}']
procedure Set_MyMessage(const Value: String);
function Get_MyMessage: String;
property _MyMessage: String read Get_MyMessage write Set_MyMessage;
end;
TMyExample1 = class(TInterfacedObject, IMyExample)
protected
fMyMessage: String;
procedure Set_MyMessage(const Value: String);
function Get_MyMessage: String;
published
property _MyMessage: String read Get_MyMessage write fMyMessage;
constructor Create();
end;
TMyExample2 = class( TMyExample1)
constructor Create();
end;
TMyExample3 = class( TMyExample2)
constructor Create();
constructor CreateBypassingTMyExample2Create();
end;
implementation
{ TMyExample1 }
constructor TMyExample1.Create();
begin
inherited;
fMyMessage := 'TMyExample1';
end;
function TMyExample1.Get_MyMessage: String;
begin
Result := fMyMessage;
end;
procedure TMyExample1.Set_MyMessage(const Value: String);
begin
fMyMessage := Value;
end;
{ TMyExample2 }
constructor TMyExample2.Create;
begin
inherited;
fMyMessage := fMyMessage + ' TMyExample2';
end;
{ TMyExample3 }
constructor TMyExample3.Create;
begin
inherited;
fMyMessage := fMyMessage + ' TMyExample3.1';
end;
constructor TMyExample3.CreateBypassingTMyExample2Create;
begin
//inherited TMyExample1.Create;
inherited ClassParent.Create;
fMyMessage := fMyMessage + ' TMyExample3.2';
end;
end.
如果我创建这些类中的每一个并输出消息
uses InheritedTest;
......
procedure DoCreateTests;
var
vMyIMyExample1, vMyIMyExample2, vMyIMyExample3_1, vMyIMyExample3_2 : IMyExample;
begin
vMyIMyExample1 := TMyExample1.Create;
vMyIMyExample2 := TMyExample2.Create;
vMyIMyExample3_1 := TMyExample3.Create;
vMyIMyExample3_2 := TMyExample3.CreateBypassingTMyExample2Create;
Memo1.Lines.Add( 'vMyIMyExample1._MyMessage = ' + vMyIMyExample1._MyMessage );
Memo1.Lines.Add( 'vMyIMyExample2._MyMessage = ' + vMyIMyExample2._MyMessage );
Memo1.Lines.Add( 'vMyIMyExample3_1._MyMessage = ' + vMyIMyExample3_1._MyMessage );
Memo1.Lines.Add( 'vMyIMyExample3_2._MyMessage = ' + vMyIMyExample3_2._MyMessage );
end;
目前正在输出
vMyIMyExample1._MyMessage = TMyExample1
vMyIMyExample2._MyMessage = TMyExample1 TMyExample2
vMyIMyExample3_1._MyMessage = TMyExample1 TMyExample2 TMyExample3.1
vMyIMyExample3_2._MyMessage = TMyExample3.2
我正在尝试调用 TMyExample3.CreateBypassingTMyExample2Create 来输出
vMyIMyExample3_2._MyMessage = TMyExample1 TMyExample3.2
我需要在此通话中进行哪些更改才能使其正常工作?是否可以在不更改或(添加另一个构造函数)到 TMyExample2.create 的情况下做到这一点
constructor TMyExample3.CreateBypassingTMyExample2Create;
begin
//inherited TMyExample1.Create;
inherited ClassParent.Create;
fMyMessage := fMyMessage + ' TMyExample3.2';
end;
解决方案
推荐阅读
- python - 单击带有 Python 的 Chrome 上的按钮,无需 webdriver
- java - 如何在没有 System.exit 的情况下停止程序
- javascript - 使用js/jquery时如何正确使用document_html和pdflayer?
- java - JAVA_HOME & JAVA_OPTS 在 catalina.sh 中设置,但 bash/python 中的“printenv”不显示这些环境变量
- powerbi - Formula.Firewall:查询(步骤“更改类型”)引用其他查询或步骤
- python - 如何保持请求有效?
- php - gethostbynamel() 和 dns_get_record() 对某些域返回空
- typescript - 在 eslint 规则中为 JSX.Element 类型的变量指定 PascalCase 命名约定
- python - 在 Django HTML 模板中根据偶数和奇数显示不同的元素
- amazon-web-services - 发生错误:服务器在处理 Lambda 响应时遇到错误。AWS Lex 和 Lambda