2012-12-08 39 views
10

Có cách nào dễ dàng để thực hiện điều này trong Smalltalk không? Tôi chắc chắn rằng 80% có một số phương pháp nhưng không thể tìm thấy nó ở bất cứ đâu.Kiểm tra xem một đối tượng có phải là một thể hiện của một lớp cụ thể hoặc của một phân lớp của nó

tôi biết rằng tôi có thể sử dụng

(instance class = SomeClass) ifTrue: 

Và tôi biết rằng tôi có thể sử dụng superclass vv ... nhưng tôi hy vọng rằng có cái gì đó được xây dựng trong :)

Trả lời

17

Để kiểm tra xem anObject là ví dụ của Aclass:

(anObject isMemberOf: aClass) 

Để kiểm tra xem nó là một thể hiện của Aclass hoặc một trong các lớp con nó:

(anObject isKindOf: aClass) 
5

Bạn là đúng, để kiểm tra các lớp chính xác mà bạn sử dụng (sử dụng danh tính thay vì):

lớp dụ == SomeClass ifTrue: []

hữu ích cũng là isKindOf: mà kiểm tra nếu Ví dụ là một lớp hoặc lớp con của lớp đưa ra:

(Ví dụ isKindOf: SomeClass) ifTrue: []

Nicest và thanh lịch nhất là để viết một phương pháp thử nghiệm trong lớp lớp cha và bạn bè, sau đó sử dụng nó như:

dụ isSomeClass ifTrue: []

+1

Nicest và thanh lịch nhất là không hỏi , ví dụ: thay vì: đối tượng isSomething ifTrue: [làm điều gì đó] sử dụng: đối tượng doSomething –

+2

Tôi đồng ý với Igor. Hơn nữa, "đẹp nhất và thanh lịch nhất" là trong mắt của khán giả. WhatInteger và bạn bè làm chắc chắn là * nhanh hơn * vì chúng là một tin nhắn đơn gửi trả về true/false so với isKindOf: nó phải lặp lại hệ thống phân cấp lớp. Nhược điểm của một số người là bạn phải thêm một phương thức isSomeClass vào Object để trả về false. –

Các vấn đề liên quan