Как проверить, является ли один класс основой другого в [incr Tcl]?

Учитывая два имени класса, className1 и className2, как я могу проверить, есть ли у className1 className2 где-нибудь в своем наследии?


person Vahagn    schedule 08.01.2012    source источник


Ответы (1)


Увы, [incr Tcl] поддерживает интроспекцию только для объектов, но не для классов; вам нужно будет создать экземпляр className1, получить его наследие с помощью info heritage $theInstance и проверить, присутствует ли className2 в этом списке. Неряшливый. (Начиная с 4.0 вы можете использовать info class subclasses className2 className1, чтобы проверить, является ли className1 прямым подклассом className2, но это не работает для косвенных подклассов, то есть с некоторыми подклассами между ними.)

Однако общие принципы объектно-ориентированного программирования в Tcl, как правило, указывают на то, что вы должны использовать утиную типизацию, если можете: не беспокойтесь о том, принадлежит ли объект правильному классу, беспокоитесь о том, может ли он отвечать на сообщения, которые вы хотите отправить к нему (то есть методы, которые вы хотите вызвать). Поскольку любой объект может отлавливать попытки вызвать вызовы неизвестного метода, вы не можете понять, что он на самом деле будет делать, с помощью интроспекции, и вам нужно просто попробовать. Или поищите документацию, если повезет.

person Donal Fellows    schedule 08.01.2012