Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Иерархия классов [D5, D6, 2000, XP]


Novice ©   (2007-04-04 07:06:00) 

Есть класс
TCore = class
private
FName : shortstring;
FInitValue : integer;
protected
...
public
...
end;

на его основе мне нужно написать два других класса, у которых есть несколько дополнительных свойств+методов, и меняется тип поля FInitValue c Integer на DWORD;

После чего хотелось бы иметь такую возможность:

Core1 : TCore;
...
Core1 := TCore.Create;
(Core1 as TNextCore).NextCoreProperty := .......

где TNextCore - это класс, основанный на TCore.

Скажите, есть ли возможность реализовать такое, и если да, то как должна выглядеть подобная структура.


Novice   (2007-04-05 08:10:00) [1]

Да, теперь я уяснил этот момент и вышел из этой ситуации. Благодарю за то, что помогли разобраться!


oxffff   (2007-04-04 14:20:00) [2]

var a:TBaseMonster;
    b:TWaterDemon;
begin

b:=TWaterDemon.create;
b.FInitValue:=.. обращается к FInitValue в TWaterDemon
a:=b;
a.FInitValue:=.. обращается к FInitValue в TBaseMonster

Так понятно?


Novice   (2007-04-04 11:32:00) [3]

>>Одно в базовом, другое в дочернем.
А вот это уже другой вопрос! Вот что я неправильно понял.
Т.е. из Ваших слов следует, что я в таком случае могу обратиться и к TBaseInitValueList, и к TWaterDemonInitValueList одновременно при той конструкции, что сейчас имею?


oxffff   (2007-04-04 11:21:00) [4]


> FInitValue : TWaterDemonInitValueList; //Вот про что я говорил.
>  Поле одно, а тип уже другой.


У тебя два поля FInitValue.
Одно в базовом, другое в дочернем.


Novice   (2007-04-04 11:17:00) [5]

to _Аноним:
>>типа "построили сарай, и пытаемся закастить его под сарай с надстройкой" :-)
Вот именно. И этот сарай разрастается до размеров целого города :-)


Novice   (2007-04-04 11:14:00) [6]

Поясню, что я имел ввиду. Не словами, а наглядным примером:

TBaseMonster = class
private
FName
FPosition : TPosition;
FDefaultAction : TDefaultAction;
FInitValue : TBaseInitValueList;
FStepType : TStepType;
protected
public
end;

TWaterDemon = class(TBaseMonster)
private
FSpells : TSpellList; //А это - уже дополнительные поля, свойственные только этому классу.
FInitValue : TWaterDemonInitValueList; //Вот про что я говорил. Поле одно, а тип уже другой.
FAnalogSpells : TSpellList; //Это тоже специфичное для класса поле.
end;
protected
public
end;

TFireDemon = class(TBaseMonster)

Ну и так далее.


oxffff   (2007-04-04 10:10:00) [7]


> Кроме того, это неоптимально с т.зр. ресурсов.


Возможность расширять variant посредством TCustomVariantType.
И compiler magic type casting это гораздо удобнее, чем 16 байт затрат.

Я могу согласиться с вами в ошибочном проектировании автора темы. Хотя он как оказалось и не это имел ввиду.


_Аноним   (2007-04-04 09:59:00) [8]


> При variant за тебя это сделает компилятор.

В некоторых случаях это как раз и плохо - когда компилятор принимает решения сам. Это расширяет поле для возможных ошибок. Кроме того, это неоптимально с т.зр. ресурсов.


oxffff   (2007-04-04 09:57:00) [9]


> в потомке кастить под нужный тип.



При variant за тебя это сделает компилятор.


oxffff   (2007-04-04 09:53:00) [10]


> Ничего универсальнее pointer'а нет.


Variant тем и хорош.
Что не нужно заботиться с приведением типов.
Да и  TCustomVariantType в помощь для расширения.


Сергей М.   (2007-04-04 09:53:00) [11]


> oxffff ©   (04.04.07 09:46) [4]
> А variant?


А что variant ?
От точно такой же тип как и все прочие.


_Аноним   (2007-04-04 09:50:00) [12]


> Сергей М. ©   (04.04.07 08:26) [2]
>
> > меняется тип поля
>
>
> > есть ли возможность реализовать такое
>
>
> Нет такой возможности.

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


> Core1 := TCore.Create;
> (Core1 as TNextCore).NextCoreProperty := .......


типа "построили сарай, и пытаемся закастить его под сарай с надстройкой" :-)
наоборот - можно, а так нельзя


Зяма   (2007-04-04 09:49:00) [13]

А variant?

Variant - от лукавого.
Ничего универсальнее pointer'а нет.


oxffff   (2007-04-04 09:46:00) [14]


> Сергей М. ©   (04.04.07 08:26) [2]
>
> > меняется тип поля
>
>
> > есть ли возможность реализовать такое
>
>
> Нет такой возможности.


А variant?

:)


Novice   (2007-04-04 08:33:00) [15]

to Думкин:
Да, Вы правы, если объявить Core1 : TCore, создать Core1 := TNextCore.Create, и обращаться (Core1 as  TNextCore), то у меня получается все, что мне нужно! Благодарю за помощь.

to Сергей М.:
Из-за недостатка знаний я не совсем верно сформулировал свой вопрос :-)


Сергей М.   (2007-04-04 08:26:00) [16]


> меняется тип поля


> есть ли возможность реализовать такое


Нет такой возможности.


Думкин   (2007-04-04 07:56:00) [17]

Core1 := TNextCore.Create;

Если так, то можно.


Наверх

Титульная страница Поиск, карта сайта Написать письмо