Эволюция классов в C++. Часть 1
От: Гарбузенко Алексей Украина http://bast.kiev.ua
Дата: 10.02.04 14:45
Оценка:
Этой задачачей я занимаюсь несколько месяцев и сейчас уже готова альфа-версия фреймворка. Поэтому и решил систематизировать имеющиеся данные и предпосылки, чтобы выложить на Ваше усмотрение. Уверен, достаточно много будет возражений и дополнений по этой теме, что несомненно позволит проработать систему и привести ее в вид, пригодный для использования.

сначала, немного теории.

Эволюция классов в C++

1. Мутация (Mutation)
1.1. Мутацией будем называть операцию замену объекта оного типа в памяти другим. Мутация в частичном виде существует в скриптовых языках высокого уровня (PHP, Perl) для простых типов в виде неявного преобразования строк, целых чисел, чисел с плавающей запятой и т.п.
1.2. Реализация мутации простых типов в C++ не реализуется без потери соответствия стандарту, поэтому рассматриваться здесь не будет.
1.3. Мутация классов в C++ реализуема при помощи оператора placement new.
1.4. Правила и ограничения мутации
1.4.1. Мутация классов в стеке возможна в том случае, если объем нового объекта не превышает объем исходного.
1.4.2. Мутация классов в динамической памяти возможна в том случае, если объем нового объекта не превышает объем памяти, выделенной для старого объекта.
1.4.3. Использование регулярных и статических методов нового типа, так же как и обращение к публичным переменным результата мутации правомочно лишь в случае явного приведения этого объекта к новому типу.
1.4.4. Использование регулярных и статических методов старого типа, так же как и обращение к его переменным по отношению к результату мутации не допустимо и приводит к неопределенному поведению.
1.4.5. Использование виртуальных методов, одинаковых по описанию и порядковому номеру в виртуальной таблице допустимо без приведений.
1.5. Разрешенной будем считать мутацию, условия проведения и использования которой не противоречат пунктам 1.5.1. — 1.5.5.
2. Эволюция (Evolution)
2.1. Частный случай разрешенной мутации, операндами которой являются объекты, имеющие общий предок или наследуемые один от другого, будем называть эволюцией.
2.2. Эволюцию, в ходе которой данные, содержащиеся в исходном объекте, теряются, будем считать деструктивной.
Пример:

#include <new.h>
#include <iostream>

class Base{
public:
virtual ~Base () {};
virtual void Ident()=0;
};
class Derived1: public Base
{
public:
Derived1():data(1) {};
virtual ~Derived1 () {};
virtual void Ident() { cout<<"Derived1"<<endl; }
int data;
};
class Derived2: public Base
{
public:
Derived2():dat(2){};
virtual ~Derived2 () {};
virtual void Ident() { cout<<"Derived2"<<endl; }
int dat;
};

int main ()
{
Base * object=new Derived1();
object->Ident();
object->~Base();
object=new(object) Derived2();
object->Ident();
delete object;
}


2.3. Эволюцию, в ходе которой все данные исходного объекта или их часть сохраняется в новом, будем считать конструктивной.
Пример:

#include <new.h>
#include <iostream>

class Base{
public:
virtual ~Base () {};
virtual void Ident()=0;
virtual int getData()=0;
virtual void setData(int)=0;
};
class Derived1: public Base
{
public:
Derived1():data(1) {};
virtual ~Derived1 () {};
virtual void Ident() { cout<<"Derived1, data: "<<data<<endl; }
virtual int getData() { return data; }
virtual void setData(int Data) { data=Data; }
private:
int data;
};
class Derived2: public Base
{
public:
Derived2():dat(2){};
virtual ~Derived2 () {};
virtual void Ident() { cout<<"Derived2, dat: "<<dat<<endl; }
virtual int getData() { return dat; }
virtual void setData(int Data) { dat=Data; }
private:
int dat;
};

int main ()
{
Base * object=new Derived1();
object->Ident();
int temp=object->getData();
object->~Base();
object=new(object) Derived2();
object->setData(temp);
object->Ident();
delete object;
}

....


В дальнейшем есть смысл рассматривать только конструктивную эволюцию.Ее реализация напрямую связана с задачей сериализации, но это уже будем обсуждать в следующей теме.

Для этой части пока все.
Это, — теоретическая база, и если окажется, что какая-то ее часть требует детального пересмотрения и переработки, — дальнейшие дальнейшие части соответственно изменятся.
"..ты только посмотри на это деградирующее новое поколение, — даже "Момент", который они нюхают придумали до них!" (с) ZerG
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.