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
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.
Składnia Delphi jest poprawna. –
@Gamecat - dzięki, usunąłem moje "disclaimer";) Nie trzeba tego jako hałasu. – Pete
W rzeczywistości jest to 'TMyClass = class', tj.' = ', A nie': '. –