![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Иерархия классов [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;
Если так, то можно.