Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1175682244
Officeman
2007-04-04 14:24
2007.04.22
Цветные делений в ProgressBar1


2-1175629090
likenoother
2007-04-03 23:38
2007.04.22
домножение


2-1175443049
DimDim
2007-04-01 19:57
2007.04.22
Close из Activate


8-1155370006
Voper
2006-08-12 12:06
2007.04.22
Изображение на рабочем столе.


2-1175695555
Magedon
2007-04-04 18:05
2007.04.22
Как добавить свой пункт в контекстное меню Ворда?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский