fez писал(а) 02. Июня 2006 :: 11:07:kms писал(а) 02. Июня 2006 :: 08:55:О
А еще ведь лучше будет отсекать каким-то методом все другие ветки, кроме той, в которой идет выполнение.
Я не стал выделять новый метод, а попытался расширить возможность существующего. Типа чтобы через ПолучитьБазовыйКласс() можно было
передать получить не только
базовый класс, но и текущий тоже. С отсеченными остальными ветками, кроме текущей.
А дальше - если нам нужен обратносовместимый полиморфизм - пользуемся Сам(Контекст). Если нам нужна только текущая ветка иерархии - пользуемся Сам(Контекст).ПолучитьТекущийКласс(). Ага?
Давай еще раз внесу ясность, как должно быть.
ПолучитьБазовыйКласс() - это полностью виртуальный метод. ЗаменитьБазовыйОбъект() - тоже.
Они определены в каждом классе.
Любой экспортный метод суперкласса - виртуальный и может быть переопределен в подклассах.
Набор виртуальных методов определяет интерфейс класса.
Не нужно никаких методов преобразований. Мысль, с которой я начал, устарела. Есть другая идея.
Как мы осуществляем поиск метода в подклассе сейчас? Мы начинаем с самого верхнего уровня и идем вниз.
Как мы осуществляем поиск метода в суперклассе сейчас?
Также.В этом проблема.
Так вот, единственное, что нам нужно сделать - это изменить алгоритм поиска при выполнении в контекстах суперклассов.
Мы снова начинаем с самого верхнего уровня, но принимаем во внимание только ветки, которые приводят нас к контексту текущего исполнения (контекст суперкласса), проходим его и идем дальше вниз.
То же самое, для методов ПолучитьБазовыйКласс() и ЗаменитьЭксзБазовогоКласса().
Поскольку мы не видим из одного супера объекты и методы других суперов, они продолжают работать корректно.
Понял? Оцени красоту идеи.