【问题标题】:Delphi error with generics and interfaces泛型和接口的Delphi错误
【发布时间】:2019-03-12 08:41:06
【问题描述】:

下面的 Delphi 代码在 Foo 函数中没有编译错误,但 Foo2 函数编译。这让我发疯,有没有人有想法?

type

  IA<T> = Interface
  end;

  TA<T> = class(TInterfacedObject, IA<T>)
    function Foo<V> : IA<V>;
  end;

  TB<U,T> = class(TA<T>)
  end;

  TC = class
    function Foo2<T,V> : IA<V>;
  end;


implementation

{ TA<T> }

function TA<T>.Foo<V>: IA<V>;
begin
  Result := TB<T,V>.Create;
end;

{ TC }

function TC.Foo2<T,V>: IA<V>;
begin
  Result := TB<T,V>.Create;
end;

【问题讨论】:

    标签: delphi generics interface


    【解决方案1】:

    这看起来确实很奇怪,我怀疑这是一个错误。您可以通过声明 TB&lt;U, T&gt; 实现 IA&lt;T&gt; 来解决它。改变

    TB<U, T> = class(TA<T>)
    

    TB<U, T> = class(TA<T>, IA<T>)
    

    请注意,删除了所有泛型的代码确实可以编译:

    type
      IA = interface
      end;
    
      TA = class(TInterfacedObject, IA)
        function Foo: IA;
      end;
    
      TB = class(TA)
      end;
    
      TC = class
        function Foo2: IA;
      end;
    
    function TA.Foo: IA;
    begin
      Result := TB.Create;
    end;
    
    function TC.Foo2: IA;
    begin
      Result := TB.Create;
    end;
    

    这似乎支持了我的信念,即您的代码是正确的并且应该被编译器接受。

    【讨论】:

    • 感谢您的回答,但为什么 Foo2 可以在不更改声明的情况下工作?
    • 正如我所说的,这对我来说似乎是一个错误
    • 我认为是因为 Foo2 明确引用了接口。 Foo on 通过类 TA 间接引用,因此需要告诉 TB 实现了接口。
    • @Dsm 我不明白。两个函数返回的类型相同,两个函数中的代码也相同。
    • @DavidHeffernan 我知道,但我在这个网站上看到过类似的问题报告,这就是原因。我认为这是设计使然,可能是安全第一,如果您隐式使用接口(通过继承),那么您必须在使用它的类中声明该接口。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多