2013-08-26 12 views
6

次は、Delphi(XE)でエラーが発生するのはなぜですか?ジェネリック型のメソッド呼び出し?

unit UTest; 

interface 


type 

TTest = class 
    public 
    procedure Foo<T>(A: T); 
end; 

implementation 

{ TTest } 

procedure TTest.Foo<T>(A: T); 
begin 
    A.Add('hej'); 
end; 

end. 

私は、Delphiでの一般的なタイプは、単に一般的な機能に挿入されたと思ったので、追加(String)メソッドを持っていないタイプで使用する場合にのみ実行エラーです。

答えて

8

Tには、単一の文字列パラメータを受け取るAddというメソッドがあることをコンパイラが認識できないため、コードでコンパイルエラーが発生します。

私は、Delphiでの一般的なタイプは、単に一般的な機能に挿入されたと思ったので、追加(String)メソッドを持っていないタイプで使用する場合にのみ実行エラーです。

SmalltalkまたはC++テンプレートを使用している場合は、正確な仮定が適用されます。しかし、ジェネリックはテンプレートと同じではありません。ジェネリックでは、typeパラメータに制約を適用する必要があります。制約はコンパイラにTが持つ必要があるプロパティを伝える必要があります。

たとえば、適切なAddメソッドを持つクラスからTを派生させることができます。または、適切なAddメソッドでインターフェイスを実装するようにTを制限することもできます。デルファイジェネリック制約の

ドキュメントへのリンク:http://docwiki.embarcadero.com/RADStudio/en/Constraints_in_Generics

適用することができ、一般的な制約はかなり限られている、恥のようなものです。たとえば、ある種の数学演算子を持つように型を制約することができればと思っています。たとえば、私は+-の演算子を持つように型を制約したいとします。しかし、ジェネリックスとテンプレートの両方に長所と短所があります。そのため、これらの制限は、Delphi言語デザイナーによる正当な設計上の決定の結果であるということを認めます。

+0

上記のようにしたい理由は、基本クラス(またはインターフェイス)を共有しないクラスが2つありますが、一部のメソッドシグネチャはまったく同じです。私はこれが限られた制約では不可能だと思いますか? – monoceres

+1

それは正しいです。これらがテンプレートであればうまくいくはずです。しかし、あなたは単にジェネリック薬で運が悪いだけです。スカラーと複素数の両方の値で動作する素晴らしい数学的アルゴリズムを書いているのと同じ問題が発生しました。 –

+1

それはあまりにも悪いです:(私はRTTIとif文(blersh)に戻す必要があると思います。 – monoceres

関連する問題