2009-09-17 13 views
6

Przeczytałem o projektach wirtualnych używanych do implementacji niektórych wzorców projektowych, ale nie zrozumiałem potrzeby konstruktorów wirtualnych. Czym więc są wirtualni konstruktorzy i dlaczego naprawdę ich potrzebujemy?Gdzie są używane konstruktory wirtualne?

Odpowiedz

12

W większości języków programowania, afaik, nie można znaleźć wirtualnych konstruktorów. Które zastąpienie wirtualnych elementów jest oceniane w środowisku wykonawczym po skonstruowaniu obiektu, ale w większości języków trzeba znać klasę rzeczywistą podczas konstruowania instancji. Dlatego wirtualne konstruktory nie mają sensu w tych językach.

W .NET można uzyskać podobne rozwiązanie za pomocą refleksji, tzn. Można skonstruować obiekt za pomocą instancji klasy Type, która reprezentuje obiekt, który ma zostać zbudowany. A dzięki ogólnemu wsparciu możesz osiągnąć coś podobnego, ale nie jest to wirtualny konstruktor.

Jedynym językiem programowania, w którym pracowałem, z prawdziwymi wirtualnymi konstruktorami, jest Delphi. W Delphi istnieje określony "typ Metaclass", tj. Konkretna konstrukcja programistyczna, która reprezentuje metaklasę (podczas gdy w .NET, klasa meta, klasa Type, jest tylko instancją normalnej klasy). Więc jeśli masz klasę o nazwie TMyClass - Deplhi nazewnictwa;)

TMyClass : Class ... 

można zadeklarować metaklasą jak ten

TMyMetaClass : class of TMyClass 

Teraz można zadeklarować zmienną, która ma TMyMetaClass typu

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

Można również skonstruować nową instancję za pomocą tej zmiennej

MyClassInstance := MyMetaClassVariable.Create(); 

Teraz MyMetaClassVariable może odnosić się do dowolnej klasy, która jest albo TMyClass lub jej specjalizacji. Jeśli konstruktor zostanie zadeklarowany jako wirtualny, wówczas zmienna zostanie zbudowana z instancją tej konkretnej klasy.

W ten sam sposób można zadeklarować wirtualne metody statyczne w Delphi i wywołać je za pośrednictwem instancji metaklasy.

Drugie pytanie? Dlaczego ich potrzebujemy? W Delphi rozwiązują niektóre z tych samych problemów, co klasa Type w .NET, pozwalając na konstruowanie obiektów, w których nie znamy nazwy klasy w czasie projektowania. Na przykład podczas projektowania formularza i umieszczania w nim wielu elementów sterujących dane te muszą zostać przekształcone do postaci szeregowej przez projektanta i przekształcone do postaci szeregowej. Gdy formularz jest deserializowany, to faktycznie metatypy są odczytywane, a poprawne instancje (czy to TextBox, ComboBox, itp.) Są konstruowane przez wywołanie konstruktora wirtualnego na metatype.

+0

Składnia Delphi jest poprawna. –

+0

@Gamecat - dzięki, usunąłem moje "disclaimer";) Nie trzeba tego jako hałasu. – Pete

+0

W rzeczywistości jest to 'TMyClass = class', tj.' = ', A nie': '. –