【问题标题】:Delphi - TInterfaceList descendant to support more types - Abstract ErrorDelphi - TInterfaceList 后代支持更多类型 - 抽象错误
【发布时间】:2011-05-04 12:42:45
【问题描述】:

我有一个类 TRow = class(TInterfaceList) 我要添加的项目是 IField 的后代(TFieldType1 和 TFieldType2) 我有一个方法,我想遍历项目并在它们上调用 IField 方法:

(Item[i] as IField).IFieldMethod

我收到抽象错误? 我究竟做错了什么?我对 OOP 或 Delphi 的理解错了吗?

谢谢

【问题讨论】:

    标签: delphi list interface abstract


    【解决方案1】:

    您有一个使用abstract virtual 方法实现IField.IFieldMethod 的类,而您忽略了Constructing instance of <TType> containing abstract method <MethodName>

    这是一个简短的控制台演示代码,显示您的错误。您使用(Item[i] as IField).IFieldMethod 调用IFieldMethod 的事实并没有提供任何新信息,它只是隐藏了问题的原因。将IField 类型的接口引用存储到一个局部变量,你就得到了我的代码:

    program Project23;
    
    {$APPTYPE CONSOLE}
    
    uses
      SysUtils,
      Classes;
    
    type IDummyIntf = interface
      procedure DoStuff;
    end;
    
    type TDummyImp = class(TInterfacedObject, IDummyIntf)
      procedure DoStuff;virtual;abstract; // TDummyImp implements IDummyIntf.DoStuff using a VIRTUAL ABSTRACT method.
    end;
    
    var X: IDummyIntf;
    begin
      X := TDummyImp.Create; // <-- Warning at this line, Constructing instance of TDummyImp containing abstract method TDummyImp.DoStuff 
      X.DoStuff; // This raises EAbstractError because TDummyImp doesn't actually implement DoStuff
      ReadLn;
    end.
    

    【讨论】:

    • 我误读了这个问题,然后我的互联网连接在我删除我愚蠢的答案之前就断开了。现在它回来了,我注意到你已经给出了正确的答案。 +1
    • 是的。我有一个实现 IField 的 TField 和实现 TField 的 TFieldType1 和 TFieldType2,其中 IFieldMethod 是虚拟的;抽象的;在 T 场。我忘了覆盖; TFieldType1 和 FieldType2 中的方法。所以这是我的错误。我正在写这个解释,以便浏览类似错误的人可以理解。谢谢。
    • 注意:如果您通过元类间接实例化类,那么编译器确实不会发出关于抽象方法的警告(因为它可以'不再检测问题)。
    猜你喜欢
    • 2021-10-24
    • 2017-06-25
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多