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
Ç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.
Delphi sözdizimi doğrudur. –
@Gamecat - teşekkürler, "feragatnamemi" kaldırdım;) Gürültü olarak buna gerek yok. – Pete
Aslında, 'TMyClass = class', yani '=' ve '' 'değil. –