【问题标题】:Delphi 6: Force compiler error on missing abstract class methods?Delphi 6:在缺少抽象类方法时强制编译器错误?
【发布时间】:2010-06-25 17:51:38
【问题描述】:

我正在使用 Delphi Pro 6。现在,知道一个类是否缺少基类抽象方法的唯一方法是等待 IDE 发出一个“包含抽象方法的{派生类}的构造实例{ base class.abstract method name}" 警告或在尝试调用缺少的方法时等待运行时抽象错误方法。前者是不够的,因为它只会为当前项目中实际构建的派生类找到警告。后者只是很痛苦。

如果 Delphi 为所有未立即声明/实现基类抽象方法的类输出致命警告会好得多。有谁知道一种设置方法或执行此操作的插件?

谢谢。

【问题讨论】:

    标签: delphi methods warnings abstract


    【解决方案1】:

    我发现最简单的方法是使用条件定义在单元初始化区域中添加一个部分,该条件定义为您认为不应该有任何抽象方法的每个类创建一个实例:

    {$IFDEF CheckAbstracts}
    initialization
      TSubclass1.Create(params);
      TAbstractClass1.Create(params); // Gives constructing instance of {derived class} containing abstract method warning
    {$ENDIF}
    

    使用 CheckAbstracts 条件编译,当你有一个未完全实现的类时,你会收到警告。

    【讨论】:

    • 有趣的方法,我想我会把它添加到我的标准实践中。
    • 这是跟踪运行时抽象错误的结果,在使用 ClassReference.Create 而不是 TClassXXX.Create 时创建
    • Gerry 的优点。这些是一个真正的痛苦的追踪,因为运行时错误似乎与真正的原因如此脱节。
    【解决方案2】:

    一个包含抽象方法的类只有在你实例化类时才是危险的,所以 Delphi 的警告是正确的。如果您忽略了至少一个“使用抽象方法实例化类”,您只会得到抽象错误运行时异常。

    【讨论】:

    • 还有另一种可能发生这种情况的方式 - 如果使用类引用。例如如果您有一个具有(虚拟)GetItemClass 函数的列表类,并且您调用 NewItem := GetItemClass.Create;,编译器无法确定您将实例化一个抽象类。
    【解决方案3】:

    不实现这些方法是有效的。您可能打算在另一个子类型中实现抽象方法。

    Delphi/Win32 的更高版本(我不记得是哪个版本了)引入了正式的abstract 类,它可以清楚地说明您何时实例化该类型和不打算实例化该类型。如果您严格使用它,那么您请求的功能将是有意义的。但对于 D6 就不清楚了。

    【讨论】:

      猜你喜欢
      • 2012-03-03
      • 2012-11-26
      • 1970-01-01
      • 2011-02-15
      • 2020-10-15
      • 1970-01-01
      • 2021-11-09
      • 2013-08-11
      • 2013-01-10
      相关资源
      最近更新 更多