2010-01-25 11 views
5

Jestem nowy w OOP, ale z "proceduralnym" tłem.Nadklasa Smalltalk kontra metaklasa?

Obecnie próbuję zrozumieć moją historię poprzez GNU Smalltalk i "Smalltalk: Getting The Message" Lovejoya.

Jestem zdezorientowany co do tego, że metaklasa i klasa Metaclass są w stosunku do superklasy. Widzę przepływ dziedziczenia superklasy -> klasa -> podklasa; ale nie widzę, jak/gdzie mieści się metaclass. TIA ...

Odpowiedz

5

Istnieje doskonały opis w bezpłatnej książce online Pharo by Example, rozdział 13 (Klasy i metaclasses). Rzeczy objaśnione w tym rozdziale są wspólne dla wszystkich implementacji Smalltalk.

+0

Dzięki za link! Wydaje się być tym, czego szukam. – duke

+1

Powinieneś uwzględnić istotę książki, która odpowiada na to pytanie, zamiast odnosić się tylko do linku. Po zerwaniu tego linku ta odpowiedź przestaje być użyteczna –

4

Istnieją dwa poziomy dziedziczenia: dziedziczenie dziedziczenia i dziedziczenie klas.

Smalltalk ma specjalny system, który umożliwia przekazywanie około klas jako obiektów. Oznacza to, że klasy są również obiektami na swoich własnych prawach. Metaclass jest "po prostu" klasą obiektu klasy.

Nie zakłóca zwykłego dziedziczenia instancji, więc nie pasuje do żadnego z użytych diagramów.

+0

@ zneak -> "Metaclass jest" po prostu "klasą obiektu klasy." Myślałem, że superklasa była "klasą obiektu klasy". To naprawdę moje pytanie - jaka jest różnica między nadklasą a metaklasem? – duke

+0

"Istnieją dwa poziomy dziedziczenia: dziedziczenie dziedziczenia i dziedziczenie klas." Z tego sformułowania, domyślam się, że jesteś mylącym dziedziczeniem i wyrozumiałością ... –

+0

To jest naprawdę to, co miałem na myśli. Podklasy mogą zastąpić metody statyczne w innych językach. – zneak

3

Istnieją dwa różne relacje w klasie oparte OO instancji i spadkowe.

Tworzenie instancji jest relacja między obiektem a jego klasie, słowo new itp Zazwyczaj jest realizowany przez wskaźnik w reprezentacji niskopoziomowych dowolnego obiektu. W Smalltalk, anObject class przechodzi przez ten wskaźnik; zdarza się również, że klasy są również obiektami, a klasy klas są nazywane metaklasami, ale jest to ta sama relacja, co w przypadku instancji.

Dziedziczenie jest relacją między klasami. Możesz przejść z klasy do superklasy, wykonując aClass superclass, i rób to dopóki nie dotrzesz do klasy Object. W Smalltalk wskaźnik nadklasy jest po prostu zmienną instancji zdefiniowaną na wszystkich klasach, a komunikat superclass jest normalnym elementem dostępowym.

0

Jako koncepcja, superclass jest rodzicem klasy obiektu. tj. poziom o jeden poziom wyższy w hierarchii klas niż klasa bieżącego obiektu.

Jako nazwana metoda zwraca nazwę bezpośredniej nadklasy odbiornika. np. to definedin Squeak Smalltalk (a także w jej pochodnych, Pharo i Cuis) jako superclass "Answer the receiver's superclass, a Class." ^superclass

W Dolphin Smalltalk, jest zdefiniowana jako `nadklasą „Odbieranie który odbiornika natychmiastowe nadklasą (lub brak).”

^superclass' 

Ale - każda klasa w hierarchii klas jest w rzeczywistości instancją jej klasy macierzystej. Zatem klasa, której przykładem jest dana klasa, jest MetaClass klasy.

Tak, np. aSortedCollection to obiekt - instancja klasy SortedCollection.

SortedCollection jest klasą o nazwie Class "SortedCollection" w dostępnej do przeglądania hierarchii klas. Jednocześnie jest to , a także instancja Metaclass - anonimowej klasy, która ma pojedynczą instancję obiektu, która jest nazwaną Klasą. Nazwana klasa jest widoczna w hierarchii klas, ale metaklasa (która jest anonimowa) jest znacznie mniej widoczna. To jest tak, że Smalltalk utrzymuje hierarchię Metaclass, tj. Hierarchię klas klas. Jest znacznie mniej widoczny, ponieważ jest przechowywany jako anonimowe obiekty systemowe, ale można znaleźć najwyższy poziom hierarchii Metaclass w przeglądarce klasy. Zarówno klasa Class, jak i klasa Metaclass można znaleźć jako podklasy klasy Behaviour, która sama jest podklasą klasy Object.

Jednym z powodów, dla których ludzie mówią, że "W Smalltalk, wszystko jest przedmiotem", jest to, że klasa Object jest źródłem wszystkich innych klas i obiektów - znajduje się na samej górze hierarchii obiektów, która zawiera hierarchię klas i hierarchia Metaclass.

(Jest to na ogół na tym etapie, że mój mózg zaczyna krwawić z uszu, ale ty po 3 punkty pomóc popchnąć to wszystko z powrotem w mojej czaszce)

Jeśli wyślesz wiadomość anInstanceOfAClass class - będziesz get
klasa obiektu anInstanceOfAClass zwrócona.

Po wysłaniu wiadomości anInstanceOfAClass class superclass - otrzymasz
rodzica Class of the object anInstanceOfAClass zwrócony.

Po wysłaniu wiadomości anInstanceOfAClass class class - otrzymasz anonimowy singleton Metaclass klasy obiektu anInstanceOfAClass zwrócony.