пятница, 19 февраля 2010 г.

Кастование от родителя к наследнику

Класс наследуется от некого базового класса-шаблона, передавая своё имя в качестве параметра шаблону. Базовый класс имеет метод, статически кастующий указатель на экземпляр конкретного класса к шаблонному типу. Таким образом возможно удобное статическое кастование от родителя к наследнику. И как следсвие, вызов переопределённых в наследнике методов из базового класса без их виртуализации. (вольное описание приёма из библиотеки 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 комментариев:

Unknown комментирует...

со слов не очень понятно... нужен код...

Unknown комментирует...

интересно посмотреть на код. если честно ничего не понял.

[k06a] комментирует...

Набросал приблизительный примерчик использования.

Unknown комментирует...

Идею понял. Мудрено в хорошем смысле этого слова)
А чём хуже обычная виртуализация?

[k06a] комментирует...

JackTheHack, мы никаких ограничений не накладываем на наследников.