8.3 Реализация

Предыдущая  Содержание  Следующая V*D*V

Используя вышеприведённые аксиомы методы 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, это решение легко может иметь неприятные последствия.

 

Предыдущая  Содержание  Следующая