Delphi

2014-10-03 31 views
7

arabirim tanımlarında sınıf yöntemleri nasıl desteklenir Bir arabirimi uygulayan bir sınıfta bir sınıf yöntemi oluşturdum, ancak arabirimin içinde tanımlayamıyorum. Delphi

IMyClass = interface 
    procedure someproc(); 
    class function myfunc() : TMyClass; // compiler doesn't like this! 
end; 

TMyClass = class(TInterfacedObject, IMyClass) 
public 
    procedure someproc(); 
    class function myfunc() : TMyClass; 
end; 

oluşturmak ve TMyClass bir örneğini dönmek myfunc() istiyorum. Örneğin:

somefunc(TMyClass.myfunc(), ...); 

TMyClass bir örneğini oluşturur ve somefunc içine geçer.

Ben IMyClass arayüzünde function myfunc() : TMyClass; tanımlayabilirsiniz, ama bunun önüne class koyarsanız, derleyici bana bir hata verir. Eğer onu bırakırsam, bana başka hatalar verir "E2291 Arayüz metodu xyz.myfunc uygulamasının eksik uygulanması" Sadece sınıfta olduğu gibi arayüzde aynı imzayı kabul etmiyor.

Bu çalışmayı daha önce görmüştüm (arayüzlerde tanımlanan sınıf yöntemleri) ama belki de değil.

Bu doğrudan desteklenmiyorsa, bunu nasıl yapıyorsunuz?

(Ben konularda durumda, Delphi XE5 kullanıyorum.)

+0

bir örnek yöntemi yerine Bu örnek yöntemi olarak çalışır –

+0

sınıf yöntemi ile arabirim yöntemi uygulamak, fakat bir örnek daha ziyade gerektirir sınıftan daha –

+0

Doğru. Bir arayüz uygulamak için bir örneğe ihtiyacınız var. –

cevap

5

Arabirimler sınıflar değildir ve class olarak işaretlenmiş yöntemler desteklemez, sadece nesne örnekleri üzerinde uygulanan ve denir olmayan class yöntemlerini desteklemek .

Aradığın şey büyük olasılıkla bir arabirim kullanmak yerine bir sınıf fabrikası olarak uygulanacak.

0

Sınıf tanımında (TMyClass) bir sınıf yöntemini (sınıflandırma yordamı) tanımlayabilirsiniz, ancak (IMyClass) arabiriminde olmayan .

+0

David, bir arabirimde bir sınıf yöntemi tanımlamaya çalışmıyor. Bir sınıf yöntemiyle bir arayüz metodu uygulamaya çalışıyor. –

2

Elde etmeye çalıştığınız şey, Delphi arabirimlerinin ikili özelliklerini ihlal ettiği için imkansızdır.

Delphi'de herhangi bir arabirim yöntemi, ilk parametresi - işaretçisini bir örneğe gizlemiştir. Örnek yöntemleri, aynı gizli parametrelere (Self, bir örneğe aynı işaretçi) sahiptir ve bundan dolayı, arabirim yöntemleri ile ikili olarak uyumludurlar.

Öte yandan, bir sınıf yönteminin gizli parametresi, sınıf vtable'ının bir göstericisidir, bu nedenle Delphi sınıf yöntemleri, Delphi arabirim yöntemleri ile ikili olarak karşılaştırılamazdır.

Varsayımlı aşağıdaki (ikili uyumlu) bildirimleri düşünebildiğim: Burada

IMyClass = interface 
    procedure someproc(); 
    function myfunc(): TMyClass; 
end; 

TMyClass = class(TInterfacedObject, IMyClass) 
public 
    procedure someproc(); 
    class function myfunc(Inst: TMyClass) : TMyClass; static; 
end; 

Ben gizli bir parametre (sınıf vtable işaretçi) ihtiyacımız yok kaldırıp örnek işaretçisi parametre eklemek için static belirtici kullanmak açık bir şekilde; ancak derleyici yukarıda esas olarak aynı olduğu için bu sözdizimini destek yapan bir basit

IMyClass = interface 
    procedure someproc(); 
    function myfunc(): TMyClass; 
end; 

TMyClass = class(TInterfacedObject, IMyClass) 
public 
    procedure someproc(); 
    function myfunc() : TMyClass; 
end; 
+0

Eğer arayüzlerde sınıf yöntemlerini desteklemek için bir değişiklik olursa, ikili gösterimin bunu mümkün kılmak için değişeceğini varsayabiliriz. – mjn