Форум: "Начинающим";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];
ВнизИерархия классов Найти похожие ветки
← →
Novice (2007-04-04 07:06) [0]Есть класс
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.
Скажите, есть ли возможность реализовать такое, и если да, то как должна выглядеть подобная структура.
← →
Думкин © (2007-04-04 07:56) [1]
Core1 := TNextCore.Create;
Если так, то можно.
← →
Сергей М. © (2007-04-04 08:26) [2]
> меняется тип поля
> есть ли возможность реализовать такое
Нет такой возможности.
← →
Novice (2007-04-04 08:33) [3]to Думкин:
Да, Вы правы, если объявить Core1 : TCore, создать Core1 := TNextCore.Create, и обращаться (Core1 as TNextCore), то у меня получается все, что мне нужно! Благодарю за помощь.
to Сергей М.:
Из-за недостатка знаний я не совсем верно сформулировал свой вопрос :-)
← →
oxffff © (2007-04-04 09:46) [4]
> Сергей М. © (04.04.07 08:26) [2]
>
> > меняется тип поля
>
>
> > есть ли возможность реализовать такое
>
>
> Нет такой возможности.
А variant?
:)
← →
Зяма (2007-04-04 09:49) [5]А variant?
Variant - от лукавого.
Ничего универсальнее pointer"а нет.
← →
_Аноним (2007-04-04 09:50) [6]
> Сергей М. © (04.04.07 08:26) [2]
>
> > меняется тип поля
>
>
> > есть ли возможность реализовать такое
>
>
> Нет такой возможности.
В принципе, извратиться можно, поскольку они один размер имеют - в потомке кастить под нужный тип. Но это, конечно, говорит об ошибочном проектировании.
> Core1 := TCore.Create;
> (Core1 as TNextCore).NextCoreProperty := .......
типа "построили сарай, и пытаемся закастить его под сарай с надстройкой" :-)
наоборот - можно, а так нельзя
← →
Сергей М. © (2007-04-04 09:53) [7]
> oxffff © (04.04.07 09:46) [4]
> А variant?
А что variant ?
От точно такой же тип как и все прочие.
← →
oxffff © (2007-04-04 09:53) [8]
> Ничего универсальнее pointer"а нет.
Variant тем и хорош.
Что не нужно заботиться с приведением типов.
Да и TCustomVariantType в помощь для расширения.
← →
oxffff © (2007-04-04 09:57) [9]
> в потомке кастить под нужный тип.
При variant за тебя это сделает компилятор.
← →
_Аноним (2007-04-04 09:59) [10]
> При variant за тебя это сделает компилятор.
В некоторых случаях это как раз и плохо - когда компилятор принимает решения сам. Это расширяет поле для возможных ошибок. Кроме того, это неоптимально с т.зр. ресурсов.
← →
oxffff © (2007-04-04 10:10) [11]
> Кроме того, это неоптимально с т.зр. ресурсов.
Возможность расширять variant посредством TCustomVariantType.
И compiler magic type casting это гораздо удобнее, чем 16 байт затрат.
Я могу согласиться с вами в ошибочном проектировании автора темы. Хотя он как оказалось и не это имел ввиду.
← →
Novice (2007-04-04 11:14) [12]Поясню, что я имел ввиду. Не словами, а наглядным примером:
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)
Ну и так далее.
← →
Novice (2007-04-04 11:17) [13]to _Аноним:
>>типа "построили сарай, и пытаемся закастить его под сарай с надстройкой" :-)
Вот именно. И этот сарай разрастается до размеров целого города :-)
← →
oxffff © (2007-04-04 11:21) [14]
> FInitValue : TWaterDemonInitValueList; //Вот про что я говорил.
> Поле одно, а тип уже другой.
У тебя два поля FInitValue.
Одно в базовом, другое в дочернем.
← →
Novice (2007-04-04 11:32) [15]>>Одно в базовом, другое в дочернем.
А вот это уже другой вопрос! Вот что я неправильно понял.
Т.е. из Ваших слов следует, что я в таком случае могу обратиться и к TBaseInitValueList, и к TWaterDemonInitValueList одновременно при той конструкции, что сейчас имею?
← →
oxffff © (2007-04-04 14:20) [16]var a:TBaseMonster;
b:TWaterDemon;
begin
b:=TWaterDemon.create;
b.FInitValue:=.. обращается к FInitValue в TWaterDemon
a:=b;
a.FInitValue:=.. обращается к FInitValue в TBaseMonster
Так понятно?
← →
Novice (2007-04-05 08:10) [17]Да, теперь я уяснил этот момент и вышел из этой ситуации. Благодарю за то, что помогли разобраться!
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.044 c