【问题标题】:How to inherit class with generic method?如何用泛型方法继承类?
【发布时间】:2015-10-09 09:41:48
【问题描述】:

有一门课

TFoo = class
  function GetValue<T>: T;
  procedure SetValue<T>(AValue: T);
end;

编译器不允许将此类的方法定义为virtual。 怎么上课

TChildFoo = class(TFoo)

可以使用祖先的方法吗?

【问题讨论】:

    标签: delphi generics delphi-xe2


    【解决方案1】:

    正如您所观察到的,泛型方法不能是虚拟的。这种类型

    type
      TFoo = class
        function Bar<T>: T; virtual;
      end;
    

    被编译器拒绝并出现以下错误:

    E2533 虚拟、动态和消息方法不能有类型参数

    你的类是这样声明的:

    type
      TFoo = class
        function GetValue<T>: T;
        procedure SetValue<T>(AValue: T);
      end;
    

    你问一个子类如何使用这些方法。例如,您可以这样做:

    type
      TChildFoo = class(TFoo)
        procedure DoSomething<T>;
      end;
    
    ....
    
    procedure TChildFoo.DoSomething<T>;
    begin
      SetValue(GetValue<T>);
    end;
    

    也就是说,你当然可以在父类中使用这些方法。您只是不能将它们声明为虚拟并覆盖它们。

    如果你有一个参数化类(而不是参数化方法),那么你可以声明虚方法,并覆盖它们。

    type
      TFoo<T> = class
        function Bar: T; virtual;
      end;
    
      TChildFoo<T> = class(TFoo<T>)
        function Bar: T; override;
      end;
    

    所以,这些是您的选择。至于如何解决你的问题,很大程度上取决于问题是什么。

    【讨论】:

    • 我寻找一个问题的“通用方式”解决方案(stackoverflow.com/questions/32988147/…),我也尝试研究 AlexS 的想法“使用具有那对类方法的类。在实现中,这些方法将委派给以前适当的专用类工作,并且已经注册以使用特定的数据类型”。
    • 我还是不太明白问题出在哪里,所以没有信心提出解决方案。我在您的另一个问题中提供了重载方法,但即便如此,我认为我知道的还不足以判断这是否适合您的问题。
    • 大卫,感谢您的帮助和时间。你当然是对的。使用重载方法——最简单有效的方法。但是让我们假设有 10 种方法,并且应该将这些方法用于 10 种不同的类型。除非它不是寻找通用解决方案的机会?
    • 通用解决方案只要你能用通用的方式写就行了跨度>
    猜你喜欢
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多