Klasa jako meta-obiekt.
Dotychczas sugerowałem patrzenie na klasę jako na wzorzec dla obiektów. Ale takie spojrzenie może być mylące w pewnych sytuacjach. Stąd nowy, lepszy model, naturalny dla niektórych innych języków programowania, gdzie klasa to też obiekt ale wyższego rzędu.
Obiekt to pewien byt programowy, który posiada stan (pola obiektu) i ma wbudowane zachowanie/funkcjonalność (zestaw metod obiektu). Czasami może to być tylko stan albo tylko funkcjonalność. Obiekt danej klasy jest tworzony procedurą New (wywołanie procedury New klasy (czyli konstruktora) poprzez użycie operatora New na rzecz klasy:
zmienna_obiektowa = New KLASA).
Klasa to byt programowy, który głównie służy to tworzenia obiektów na swój wzór i podobieństwo. Stąd określenie wzorzec. Ale jednocześnie klasa to pewien egzemplarz, obiekt nadrzędny, który istnieje niezależnie i którego nie trzeba tworzyć, bo powstaje w wyniku definicji „Class KLASA … End Class”. Jako obiekt posiadać może, jak każdy obiekt, stan i zachowanie. Które pola i metody są częścią obiektu KLASA? Te, które mają przedrostek „Shared”. Są one dostępne także w obiektach dzieciach, czyli tzw. instancjach klasy, ale to tylko dostęp, czyli prawo zapisu (pola), odczytu (pola) i prawo wykonania (metody) ale definicja tychże jest w meta-obiekcie KLASA! CO BĘDZIE, JEŚLI ŻADNA SKŁADOWA KLASY NIE MA przyrostka „Shared”? Wtedy klasa służy tylko jako wzorzec dla obiektów. Jeżeli jest to klasa W PEŁNI abstrakcyjna (MUSTINHERIT i brak pól i definicji metod/funkcji/procedur a tylko deklaracje metod - czyli zapowiedzi, nagłówki, sygnatury) , czyli musi po niej dziedziczyć inna klasa, to można uznać, że jest to w tym i poprzednim przypadku meta-obiekt pusty - nic nie zawiera, nic nie robi.
Przykłady klas i obiektów
Klasa definiująca tylko pola nie-„Shared” - to fabryka struktur danych (obiektów złożonych tylko z pól). Konstruktor może być niejawny, zależnie od żądań jakie stawia programista - ale pola muszą być Public, skoro nie ma metod, które je hermetyzują.
Klasa bez pól definiująca wszystkie składowe jako Public Shared; jest to pojemnik na funkcje/procedury - czyli biblioteka funkcji/procedur. Przykład: wbudowana klasa Math: elementy to m. in. Math.Sqrt, Math.Sin, Math.PI itd. (ale nie Randomize() i nie Rnd())
Typowa klasa - część składowych „Shared”, część „nie-Shared”.: obiekty zawierają pola/metody „nie-Shared”, a odwołują się do meta-obiektu w zakresie zdefiniowanych w nim pól/metod „Shared”