![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Я пытаюсь вникнуть в ООП, возникли вопросы. Помогите! [Delphi]
JUS © (2004-08-17 18:06:00)Я пытаюсь вникнуть в ООП, возникли вопросы. Помогите!:(
>>Например создал я родительский клас TCar(Транспотное средство)..
Вот код программы: (на форме: Button1,Label1)
TCar=class
Private
name:string;
fuel:integer;
speed:integer;
massa:integer;
{ Published
Property PName:string read Name write Name;
Property PFuel:integer read Fuel write Fuel;
Property PSpeed:integer read Speed write Speed;
Property PMassa:integer read Massa write Massa;}
public
constructor Create;
destructor Destroy;
end;
TVaz- это значит потомок TCar,
TVaz=class(TCar)
Private
name:string;
fuel:integer;
speed:integer;
public
constructor Create;
destructor Destroy;
end;
ну в чём разница в данном примере?, с таким же успехом я мог бы сделать TVazродительским, да я понимаю что в TCarвPrivateя мог бы описать к примеруmassa:integer;и использовть к примеру к другому скажем потомку, напримерTPlane(TCar). но как использовать? В конструкторе TCarпеременная Name:='транспотное средство', В TVazNameя закоментировал, значит по идее при нажатии Button1на Label1выведется значениеNameкласса TVazпо умолчанию т.к. TVaz(TCar)наследован от TCar. (Поправьте если я не прав). По идее проще говоря Label1дожен вывести на экран "Транспотное средство", но почему-то Label1пустой.
var
Form1: TForm1;
implementation
{$R *.dfm}
constructor TCar.Create();
begin
inherited Create;
Name:='Транспортное средство';
Fuel:=0;
Speed:=0;
massa:=0;
end;
constructor TVaz.Create();
begin
inherited Create;
// Name:='Ваз-21112';
Fuel:=50;
Speed:=200;
end;
destructor TCar.Destroy();
begin
inherited Destroy;
end;
destructor TVaz.Destroy();
begin
inherited Destroy;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
label1.Caption:=TVaz.Create.name;
end;
end.
подскажите что нетак?
И для чего нуженPublished? это типа свойства как вobject ispectore?
JUS (2004-08-18 11:57:00) [21]
> > IF key=vk_(кнопка построения солдака) Then Begin TSoldat.Create(N);
>
> > i:=i+1; ... end;
>
> И хде ты потом солдат искать будешь?...
Ну например
TSoldat=class
TX:integer;
TY:integer;
...
end;
var x,y:integer;
...
________
X:=TX;
TSoldat.Create.TX:=X;
JUS (2004-08-18 11:54:00) [22]забыл N:=i;
Рамиль (2004-08-18 11:53:00) [23]
> IF key=vk_(кнопка построения солдака) Then Begin TSoldat.Create(N);
> i:=i+1; ... end;
И хде ты потом солдат искать будешь?...
JUS (2004-08-18 11:52:00) [24]
А вот
TSoldat=class
...
Constructor create(N:Integer); //где N - номер солдата
end;
..
var I:integer;
...
IF key=vk_(кнопка построения солдака) Then Begin TSoldat.Create(N); i:=i+1; ... end;
такой пример не подходит или глупый пример?
Skyle (2004-08-18 10:59:00) [25]
procedure TForm1.Button1Click(Sender : TObject);
var Footmans : TList;
I : Integer;
begin
Footmans := TList.Create;
try
for I := 0 to 9 do
Footmans.Add(TFootman.Create);
//Теперь пехотинцы 2 и 5 идут нафик
TFootman(Footmans[1]).GoFarFarAway;
TFootman(Footmans[4]).GoFarFarAway;
finally
//Освободить всех пехотинцев и Footmans
end;
end;
JUS (2004-08-18 10:50:00) [26]_?
JUS (2004-08-18 01:23:00) [27]Да, то что ты написал я понял, но вопрос
попытаюсь правильно сформулировать
Я создал класс отряд ТПехотинец скажем, могу описать в программе
var Пехотинец1.ТПехотинец;
Begin
...
end;
var Пехотинец2.ТПехотинец;
Begin
...
end;
var Пехотинец3.ТПехотинец;
Begin
...
end;
Ну а программно через кнопку Button как мне создать Пехотинца4, 5, 6...?
и как мне потом к ним обращаться?
jack128 (2004-08-18 00:37:00) [28]
> А вот в стратегиях как делают? К примеру нажимаеш построить
> сотдата, ещё одного и еще человек 10... Лимит 200 солдат.В
> программе что пишут класс для каждого солдата ? или хватает
> одного класса солдата?
Вопрос показывает, что ты не понимаеш в чем различие между объектом и классом.
На твоем примере с машинами:
класс TCar описывает свойства машины ВООБЩЕ, то есть раз у машины есть масса, скорость, тип коробки передач и тд, то ты объвляешь соответствующие свойства Speed, Mass и тд. А объект - эта какая то конктреная машина, например машина Жени
var
CarOfJack128: TCar;
begin
CarOfJack128 := TCar.Create;
CarOfJack128.Speed := 120;
...
// Предположим у машины в следствии износа упала скорость
CarOfJack128.Speed := 60;
..
end;
Или например класс TЧеловек. И объекты - экзмпляры этого класса Jack128, JUS, Гаврила и тд То есть объект - это отображение в программе чего то (или кого то) конкретного..
По поводу статегий - там разумно создать класс для каждого рода войск.
TПехотинец, TКавалерист, ТАртелерист
При этом для игр типа старкрафта для каждого КОНКРЕТНОГО солдата на поле боя создается свой объект. А вот в HOMM объект - это отряд. Там нет такого понятия как отдельный солдат, там все мереется отрядами..
Кривовато написал, но надеюсь поймешь..
Гаврила (2004-08-18 00:04:00) [29]
> И для чего нужен Published? это типа свойства как в object
> ispectore?
Не совсем так. Это свойства, доступ к которым можно получить в RunTime по имени свойства или по индексу.
По имени имеется в виду в виде строковой переменной.
Ну и, соответственно, инспектор работает через них
JUS (2004-08-17 23:49:00) [30]_
JUS (2004-08-17 23:17:00) [31]Я имею в виду не типа Heroes of magic где и я могу сделать кол-во людей как Копейщик:=Копейщик+1; а например в C&C Red Alert
Ты надеюсь так и понял.
Servelat (2004-08-17 22:19:00) [32]Хватает одного...
JUS (2004-08-17 22:17:00) [33]А вот в стратегиях как делают? К примеру нажимаеш построить сотдата, ещё одного и еще человек 10... Лимит 200 солдат.В программе что пишут класс для каждого солдата ? или хватает одного класса солдата?
CoolProger:DWORD; (2004-08-17 21:53:00) [34]это вопрос про ОПП, тебе надо в основной форум а не в игрушки, и книги надо читать больше, тогда флуда будет меньше
JUS (2004-08-17 21:52:00) [35]
> Алхимик
благодарю:)
JUS (2004-08-17 21:51:00) [36]Ок, всё понял, спасибо тебе!
I>
> Кстати, ты конференцию неправильно выбрал :) , это у играм
> слабо относится.
Основная конференция подойдет?<
Алхимик (2004-08-17 21:37:00) [37]Введение в ООП:
http://www.firststeps.ru/theory/oop/r.php?2
Путешествуя по TObject. Или как оно работает:
http://www.delphikingdom.ru/helloworld/tobject.htm
Servelat (2004-08-17 21:32:00) [38]Слушай, я тебе наврал :) , сорри.
Просто не надо было второй комплект переменных объявлять в дочернем классе, конструкторы и так перекрываются без этих ухищрений с virtual/override. Надеюсь я тебя не запутал окончательно :).
Кстати, ты конференцию неправильно выбрал :) , это у играм слабо относится.
Servelat (2004-08-17 21:25:00) [39]Тут фокус с конструкторами и деструкторами.
Вот эта строчка:
inherited Create;
вызывает кончтруктор прародителя всех классов TObject'а. Дело в том, что у объекта может быть куча конструкторов, с одинаковыми именами (обычно Create) или с разными - не важно (для примера, набери в Делфевом коде где-нить Exception (один из стандартных классов), поставь точку и посмотри, скока конструкторов в выпадающем меню (около 12, Create, CreateRes, CreateFmt, на все случаи жизни)). Ты в классе TVaz объявил новый конструктор, код старого при этом не выполняется, чтобы перекрыть старый конструктор, тебе нужно:
1) в объявлении класса TCar изменить объявление конструктора вот так:
constructor Create; virtual;
2) в объявлени класса TVaz соответственно объявить конструктор с ключевым словом override;
3) не забыть в коде TVaz.Create написать inherited; именно по этой команде будет вызываться код, написанный тобой в TCar.Create.
И еще: при объявлении потомка не нужнообъявлять все переменные предка снова (как это сделано у тебя), они присутствуют по определению, так как это его потомок:
TVaz=class(TCar)
Private
следующие три строки можешь удалить
name:string;
fuel:integer;
speed:integer;
public
constructor Create; override;
destructor Destroy;
end;
Но при этом надо помнить, что то, что объявлено в private из другого модуля видно не будет. Поэтому в твоем случае эти объявления лучше либо переносить в public секцию, либо создать свойства, которые соответствуют твоим полям (у тебя это в виде комментария присутствует).
Насчет published - ты в принципе прав, это тоже, что и public, но роль играет только при написании компонентов, те свойствы, что описаны в published в инспекторе объектов есть.
JUS (2004-08-17 19:08:00) [40]???