8.3 Реализация |
Предыдущая Содержание Следующая |
Используя вышеприведённые аксиомы методы isA() и isOf() довольно просто реализовать:
% isA { return _self && classOf(_self) == class; }
% isOf { if (_self) { const struct Class * myClass = classOf(_self);
if (class != Object) while (myClass != class) if (myClass != Object) myClass = super(myClass); else return 0; return 1; } return 0; }
Первая, очень наивная реализация cast() была бы основана на isOf():
% cast { assert(isOf(_self, class)); return (void *) _self; }
isOf(), а поэтому и cast(), не работает для пустых указателей. isOf() полагает без дальнейших проверок, что любой указатель указывает по крайней мере на экземпляр Object; поэтому, мы можем быть уверены, что cast(Object, x) не будет работать только для нулевых указателей. Однако, как мы увидим в разделе 8.5, это решение легко может иметь неприятные последствия.
|
Предыдущая Содержание Следующая |