2012-12-08 10 views
10

Czy istnieje prosty sposób to zrobić w Smalltalk? Mam 80% pewności, że istnieje pewna metoda, ale nie mogę jej nigdzie znaleźć.Sprawdź, czy obiekt jest instancją danej klasy lub podklasy nim

wiem, że mogę używać

(instance class = SomeClass) ifTrue: 

I wiem, że mogę używać superclass etc ... ale mam nadzieję, że coś jest zbudowane w :)

Odpowiedz

17

Aby sprawdzić, czy instancja jest jakisObiekt od aClass:

(anObject isMemberOf: aClass) 

celu sprawdzenia, czy jest to przypadek aClass lub jeden z jego podklasy

(anObject isKindOf: aClass) 
5

Masz rację, aby sprawdzić dokładnie klasy używanego (przy użyciu tożsamości zamiast):

instancja klasy == SomeClass ifTrue: []

Przydatne jest również isKindOf: który sprawdza, czy przykładem jest klasa lub podklasa danej klasy:

(przykład isKindOf: SomeClass) ifTrue: []

najpiękniejszych i najbardziej elegancki jest napisać metodę badania w klasach superklasy i rówieśnikami, a następnie używać go jak:

instancji isSomeClass ifTrue: []

+1

najpiękniejszych i najbardziej elegancki jest nie zapytać , powiedz, np: zamiast: obiekt isCoś się dzieje, jeśli jest prawdą: [zrób coś] użyj: obiekt doSomething –

+2

Zgadzam się z Igorem. Co więcej, "najpiękniejszy i najbardziej elegancki" jest w oku patrzącego. To, co robiąInteger i przyjaciele, jest zdecydowanie * szybsze *, ponieważ są one pojedynczą wysyłaną wiadomością, która natychmiast zwraca wartość true/false versus isKindOf: która musi zapętlić hierarchię klas. Minusem dla niektórych osób jest to, że musisz dodać metodę IsSomeClass do obiektu, który zwraca wartość false. –