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

Вниз

Иерархия классов   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.065 c
2-1175145472
Pavel Kuznecov
2007-03-29 09:17
2007.04.22
Indy 10 и отлов ошибок


15-1174956277
Бакук
2007-03-27 04:44
2007.04.22
Хранение форм


2-1166517903
Sanek_sd
2006-12-19 11:45
2007.04.22
пару вопросов по клиент сервер


2-1175260591
G
2007-03-30 17:16
2007.04.22
Ноль


2-1175424779
Ezorcist
2007-04-01 14:52
2007.04.22
Почему у TFrame нету OnCreate и OnDestroy?