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