Класс наследуется от некого базового класса-шаблона, передавая своё имя в качестве параметра шаблону. Базовый класс имеет метод, статически кастующий указатель на экземпляр конкретного класса к шаблонному типу. Таким образом возможно удобное статическое кастование от родителя к наследнику. И как следсвие, вызов переопределённых в наследнике методов из базового класса без их виртуализации. (вольное описание приёма из библиотеки sl)
Приблизительный код:
////////////////////////////////////////////////////////////////
template <typename T>
class SelferT
{
public:
T &GetSelf()
{
return static_cast<T &>(*this);
}
const T &GetSelf() const
{
return static_cast<const T &>(*this);
}
};
////////////////////////////////////////////////////////////////
class RefCount : protected SelferT<T>
{
public:
// Конструктор копирования - увеличивает счётчик ссылок
RefCount(
IN const RefCount &rhs
) : _refCount(rhs._refCount)
{
// ...
}
// Оператор присваивания - увеличивает счётчик ссылок
RefCount &operator=(IN const RefCounted &rhs)
{
// ...
}
// Деструктор - уменьшает счётчик ссылок
~RefCount()
{
// ...
if (*_counter == 0)
GetSelt().OnDispose();
}
// Вызывается, когда число ссылок становится равно нулю
void OnDisposed()
{
}
};
////////////////////////////////////////////////////////////////
class A : public RefCount<A>
{
public:
// ...
// Вызывается, когда число ссылок становится равно нулю
void OnDisposed()
{
}
};
////////////////////////////////////////////////////////////////
Подсветка синтаксиса выполнена при помощи Notepad++
Если виртуализация методов класса позволяет добраться до последнего наследника базового класса, то данный метод позволяет добраться до конкретного наследника. С этим приёмом мы получили интерфейс в стиле Java, но без обязательного переопределения методов.
Ссылка по теме:
Преобразование ссылки на интерфейс для реализации класса в Delphi 2010
5 комментариев:
со слов не очень понятно... нужен код...
интересно посмотреть на код. если честно ничего не понял.
Набросал приблизительный примерчик использования.
Идею понял. Мудрено в хорошем смысле этого слова)
А чём хуже обычная виртуализация?
JackTheHack, мы никаких ограничений не накладываем на наследников.
Отправить комментарий