gpt4 book ai didi

Delphi - 向下转换对象不调用基本方法

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

我有一个基本对象类型:TBServiceBookings,然后我从中派生了另一个对象类型:TBServiceQuotes

因此,当创建表单时,我决定使用哪个对象。在本例中,我创建了派生对象。

if fScreenType = ST_NewAppointment then
fBookingObject := TBServiceBookings.CreateServiceBookings(nil,botSingle)
else
fBookingObject := TBServiceQuotes.CreateServiceQuotes(nil,botSingle);

在某个阶段我只想调用基类的方法。因此,我将派生对象转换为基类型并调用它的方法,但它继续转到派生方法 - 这是我不想要的。

我已经尝试过:

1)  fBookingObject := TBServiceBookings(fBookingObject);
fBookingObject.SetupNewAppointmentScreen;

2)
TBServiceBookings(fBookingObject).SetupNewAppointmentScreen;

3)
(fBookingObject as TBServiceBookings).SetupNewAppointmentScreen;

我错过了什么?为什么每次都会调用派生方法,即使我专门向下转换来调用基本方法?

我剩下的唯一选择是创建一个基本类型的新变量,然后继续。但我已经有一个表单变量,它是我的对象,我只想调用特定的基类方法。

请提供任何帮助!

最佳答案

除了您的问题“您在哪里需要这个不寻常且有些可疑的构造?”背后的问题之外,还有一些访问祖先虚拟方法的可能性。

  1. 真的很难看:更改组件的类型:

    var
    SaveType: TClass;
    begin
    SaveType := Self.ClassType;
    PClass(Self)^ := TAncestor;
    try
    Self.AncestorMethod;
    finally
    PClass(Self)^ := SaveType
    end;
    end;
  2. 强制转换方法而不是类:

    type
    TInstanceMethod = procedure(Instance: TObject);

    begin
    TInstanceMethod(@TAncestor.AncestorMethod)(Self);
    end;
  3. 使用类助手:

    type
    TAncestorHelper = class helper for TAncestor
    procedure AncestorMethodViaHelper;
    end;

    procedure TAncestorHelper.AncestorMethodViaHelper;
    begin
    inherited AncestorMethod;
    end;

    begin
    Self.AncestorMethodViaHelper;
    end;

当需要时,我自己总是使用第二种解决方案。但这只是在与祖先打交道时我无法改变,例如VCL。在您自己的框架内,您永远不需要这些技巧,因为您只需重新设计即可。

关于Delphi - 向下转换对象不调用基本方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32711798/

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