Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.17;
Скачать: CL | DM;

Вниз

Как создать объекты производного класса еще в предке?   Найти похожие ветки 

 
Пубертанец   (2003-07-04 09:06) [0]

Уважаемые знатоки,

есть классы TReestr1, TReestr2, TReestr3 и базовый для них класс TReestr. Причем в published properties TReestr3 входят ссылки на TReestr1 и TReestr2.
Чтобы не писать в контрукторе TReestr3:
Reestr1:=TReestr1.Create(nil);
Reestr2:=TReestr2.Create(aaa);

я решил создать их еще в контрукторе предка (TReestr). Например,

constructor TReestr.Create(RemoteServer: TCustomRemoteServer);
var
PropList: PPropList;
i, count: integer;
TypeKind: TTypeKind;
begin
inherited Create;
cds:=TClientDataSet.Create(nil);
cds.RemoteServer:=RemoteServer;
cds.ProviderName:="pr";
cds.Active:=false;
count:=GetPropList(self, PropList);
for i:=0 to count-1 do begin
TypeKind:=PropType(self, PropList[i].Name);
if TypeKind=tkClass then
if GetObjectPropClass(PropList[i]).InheritsFrom(TReestr) then begin
SetObjectProp(self, PropList[i], XXXXX);
end;
end;
end;



вот не знаю, что должно быть вместо ХХХХХ - так, чтобы для Reestr1 было TReestr1.Create(RemoteServer), а для Reestr2 -TReestr2.Create(RemoteServer)


 
Radionov Alexey ©   (2003-07-04 10:23) [1]

делай виртуальный конструктор, который перекрываешь у потомков и вместо XXXXX просто идет TReestr1, хотя передавть туда можно любой его потомок. Все вызовется правильно. Собственно, виртуальные конструкторы - одно из фундаментальных решений для функционирования VCL


 
Пубертанец   (2003-07-04 10:48) [2]

Спасибо, хоть кто-то отозвался. Но, честно говоря, я ничего не понял. На примере не можешь показать?


 
Radionov Alexey ©   (2003-07-04 11:32) [3]

Честно говоря не до конца въехал....
Поэтому в первом вопросе немного нагнал.

Попробуй это. Может, идея прокатит.


type

TReesters = class of TReestr;

var cReestr : TReesters;
begin

if GetObjectPropClass(PropList[i]).InheritsFrom(TReestr) then begin
cReestr := GetObjectPropClassi]);// возможно понадобится приведение типов
SetObjectProp(self, PropList[i], cReestr.Create() );
end;


 
Radionov Alexey ©   (2003-07-04 11:49) [4]

У меня что-то похожее было:
Знал, что надо создавать потомок одного из классов, но не знал какого именно. Сделал так:

type
TFormClass = Class Of TForm;

Procedure TMainForm.ActivateMDIForm(Var Form; Const cType: TFormClass; _ShowModal: Boolean = false); // cType - передаваемый класс, экземпляр которого надо создать. Как я понял, у тебя он тоже известен. Это GetObjectPropClass(PropList[i])
Begin
If Pointer(Form) = Nil Then
Begin
Pointer(Form) := cType.Create(Self); // Создаем
If _ShowModal Then
TForm(Form).ShowModal
Else
TForm(Form).Show;
End
Else
TForm(Form).BringToFront;
End;

По мотивам этого я кинул предыдущий пост. Конечно, надо поправить:


type

TReesters = class of TReestr;

var cReestr : TReesters;
begin

if GetObjectPropClass(PropList[i]).InheritsFrom(TReestr) then begin
cReestr := GetObjectPropClass(PropList[i]);// возможно понадобится приведение типов
SetObjectProp(self, PropList[i], cReestr.Create() );
end;
end;


 
Юрий Зотов ©   (2003-07-04 11:55) [5]

Реализуется все это проще, без всякой RTTI. Но давайте сначала выясним главное - а ЗАЧЕМ создавать в TReestr объекты, которые реально нужны только в TReestr3? Код усложнится, расход памяти увеличится. В чем СМЫСЛ?


 
Пубертанец   (2003-07-04 12:58) [6]

2 Radionov Alexei
>>cReestr := GetObjectPropClass(PropList[i]);// возможно понадобится приведение типов

Вот в этом и вся проблема. Как привести эти типы в данном случае?


2 Юрий Зотов

Никакого лишнего расхода памяти. Ведь объекты типа TReestr создаются только, если в потомках есть public properties nbgf TReestr


 
Radionov Alexey ©   (2003-07-04 13:25) [7]

>Вот в этом и вся проблема. Как привести эти типы в данном случае?
cReestr := Pointer(GetObjectPropClass(PropList[i]));



 
Пубертанец   (2003-07-04 14:33) [8]

Ну, ты молодец. Работает.

Большое спасибо


 
Radionov Alexey ©   (2003-07-04 14:39) [9]

>Пубертанец (04.07.03 14:33)
Не за что.
Все-таки стоит продумать структуру классов, имхо здесь так и попахивает некоторой искусственностью.


 
Юрий Зотов ©   (2003-07-04 15:12) [10]

> Пубертанец (04.07.03 12:58)
> Никакого лишнего расхода памяти.

1. Две ссылки - 8 байт.
2. Лишний код - думаю, порядка сотни байт.

Скажете, ерунда? Может быть. До тех пор, пока не потребуется создать, например, приличный массив таких объектов. Или их список. После этого может оказаться уже и не ерундой.

Вот из таких "мелочей" и состоят все программы. Мелочь тут, мелочь там - бац! а в сумме-то уже и не мелочь получается!

А главное, что Ваша затея просто не нужна. Потому что никакого реального смысла и никакой реальной логики в ней нет. Она просто "притянута за уши". Просто потому, что так захотела левая нога программиста. Кстати, об этом же сказал и Radionov Alexey.

А делаются подобные вещи - например, посмотрите, как создаются колонки у TDBGrid.



Страницы: 1 вся ветка

Текущий архив: 2003.07.17;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.016 c
1-55519
prestupnick
2003-07-04 23:03
2003.07.17
проблема CheckBox


1-55652
Balkon
2003-07-04 13:36
2003.07.17
Что понимается под текущей директорией, возвращаемой...


3-55390
Vladislav
2003-06-21 16:40
2003.07.17
SQLScript


14-55779
MBo
2003-06-30 11:57
2003.07.17
О вечном случайном...


14-55718
Alex_x
2003-07-02 10:11
2003.07.17
Написание Хелпов