2013-08-26 21 views
6

Aşağıdakiler neden Delphi'de (XE) bir hata oluşturur? Genel türünde yöntem çağırma?

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. 

Ben Delphi jenerik tipleri sadece jenerik fonksiyonu eklendiğini düşündüm, bu yüzden bir Ekle (string) yöntemini yok türüyle kullanılırsa sadece dışarı hata olacaktır.

cevap

8

Derleyiciniz bir derleme hatası üretir çünkü derleyici, T'un tek bir dize parametresi alan Add adlı bir yönteme sahip olduğunu bilmez.

Delphi'deki genel türlerin yalnızca genel işleve eklendiğini düşünmüştüm, bu nedenle yalnızca bir Add (string) yöntemine sahip olmayan bir türle kullanılırsa hata verir.

Smalltalk veya C++ şablonlarını kullanıyorsanız, varsayımınız doğru olur. Ancak, jenerikler şablonlarla aynı değildir. Jenerikler için tip parametresine bir kısıtlama uygulamanız gerekir. Kısıtlayıcı, derleyiciye T özelliklerinin sahip olması gerektiğini söylemelidir. Örneğin, uygun bir Add yöntemine sahip bir sınıftan türetilmek üzere T kısıtlayabilirsiniz. Ya da uygun bir Add yöntemiyle bir arayüz uygulamak için T'u sınırlayabilirsiniz. Delphi jenerik kısıtlamaları için

Belgeler linki: http://docwiki.embarcadero.com/RADStudio/en/Constraints_in_Generics

uygulanabilir jenerik kısıtlamalar oldukça sınırlıdır, bir utanç şeydir. Örneğin, belirli matematiksel operatörlere sahip olmak için bir türü kısıtlayabilmeyi çok isterim. Örneğin, bir türünü + ve - işleçlerine sahip olacak şekilde kısıtlamak istiyorum. Bununla birlikte, hem jenerik hem de şablonlar için artıları ve eksileri vardır ve bu yüzden bu sınırlamaların Delphi dil tasarımcılarının haklı bir tasarım kararının sonucu olduğunu kabul ediyorum.

+0

Yukarıdakileri yapmak istememin nedeni, temel sınıfı (veya arabirimi) paylaşmayan iki sınıf olduğudur, ancak bazı yöntem imzaları tam olarak aynıdır. Sınırlı kısıtlamalarla bu mümkün değil sanırım? – monoceres

+1

Bu doğru. Bunlar şablonlar olsaydı, iyi olursun. Ama sadece jeneriklerle şanstan yoksun. Hem skaler hem de karmaşık değerlerde çalışabilen güzel matematiksel algoritmalar yazmamı durduran aynı soruna girdiniz. –

+1

Bu çok kötü :(Ben RTTI ve if deyimleri (blersh) dönmek zorunda sanırım. – monoceres

İlgili konular