2009-09-17 19 views
6

Sanal kurucuların, bazı tasarım desenlerini uygulamak için kullanıldığını, ancak sanal kurucuların herhangi bir ihtiyacını anlamadığını okudum. Peki sanal kurucular nelerdir ve neden onlara gerçekten ihtiyacımız var?Sanal yapıcılar nerede kullanılır?

cevap

12

Çoğu programlama dilinde, afaik, sanal kurucuları bulamıyorsunuz. Bir nesnenin oluşturulmasından sonra çalışma zamanında sanal üyelerin hangi geçersiz kılmalarının değerlendirildiği, ancak çoğu dilde örneğini oluştururken gerçek sınıfı bilmeniz gerekir. Bu nedenle sanal kurucular bu dillerde hiçbir anlam ifade etmemektedir.

.NET'te yansımayla benzer bir çözüm elde edebilirsiniz, yani oluşturmak istediğiniz nesneyi temsil eden Type sınıfının bir örneğiyle bir nesne oluşturabilirsiniz. Ve genel destekle, benzer bir şey elde edebilirsiniz, ancak sanal kurucular değil.

Gerçek sanal yapıcılarla çalıştığım tek programlama dili Delphi'dir. Delphi'de, belirli bir "Meta Sınıfı türü" vardır, yani bir metaclassı temsil eden özel bir programlama yapısı vardır (.NET'de, meta sınıfı, Type sınıfı, sadece normal bir sınıfın bir örneğidir). Eğer TMyClass adlı bir sınıf var eğer öyleyse - Deplhi adlandırma kuralları;) Şimdi bu

TMyMetaClass : class of TMyClass 

gibi metaclass ilan edebilir

TMyClass : Class ... 

, sen TMyMetaClass tipte bir değişken bildirebilirsiniz

MyMetaClassVariable : TMyMetaClass 
... 
// Assign the meta class to refer to our concrete class 
MyMetaClassVariable := TMyClass; 

Ve bu değişkeni kullanarak yeni bir örnek oluşturabilirsiniz

MyClassInstance := MyMetaClassVariable.Create(); 

Şimdi, MyMetaClassVariable, TMyClass ya da bunların bir uzmanlığı olan herhangi bir sınıfa başvurabilir. Kurucu sanal olarak bildirilmişse, değişken bu belirli sınıfın bir örneğiyle oluşturulacaktır.

Aynı şekilde, Delphi'de sanal statik yöntemleri bildirebilir ve bunları meta sınıfın bir örneğinden geçirebilirsiniz.

Yani diğer soru? Neden onlara ihtiyacımız var? Peki, Delphi'de, .NET'teki Type sınıfı ile aynı sorunları çözüyorlar ve tasarım zamanında sınıf adını bilmediğiniz nesneleri oluşturmanıza izin veriyorlar. Örneğin, bir form tasarladığınızda ve bir grup denetime koyduğunuzda, bu verilerin tasarımcı tarafından serileştirilmesi ve seri hale getirilmesi gerekir. Formal serileştirildiğinde, o zaman aslında okunan metatypes ve doğru örnekler (TextBox, ComboBox, vb), metatype üzerinde sanal yapıcıyı çağırarak oluşturulur.

+0

Delphi sözdizimi doğrudur. –

+0

@Gamecat - teşekkürler, "feragatnamemi" kaldırdım;) Gürültü olarak buna gerek yok. – Pete

+0

Aslında, 'TMyClass = class', yani '=' ve '' 'değil. –

İlgili konular