Форум: "Основная";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
ВнизЯ пытаюсь вникнуть в ООП, возникли вопросы. Помогите! Найти похожие ветки
← →
JUS (2004-08-17 18:06) [0]Я пытаюсь вникнуть в ООП, возникли вопросы. Помогите!:(
>>Например создал я родительский клас 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-17 19:08) [1]???
← →
Servelat © (2004-08-17 21:25) [2]Тут фокус с конструкторами и деструкторами.
Вот эта строчка: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 в инспекторе объектов есть.
← →
Servelat © (2004-08-17 21:32) [3]Слушай, я тебе наврал :) , сорри.
Просто не надо было второй комплект переменных объявлять в дочернем классе, конструкторы и так перекрываются без этих ухищрений с virtual/override. Надеюсь я тебя не запутал окончательно :).
Кстати, ты конференцию неправильно выбрал :) , это у играм слабо относится.
← →
Алхимик © (2004-08-17 21:37) [4]Введение в ООП:
http://www.firststeps.ru/theory/oop/r.php?2
Путешествуя по TObject. Или как оно работает:
http://www.delphikingdom.ru/helloworld/tobject.htm
← →
JUS (2004-08-17 21:51) [5]Ок, всё понял, спасибо тебе!
I>
> Кстати, ты конференцию неправильно выбрал :) , это у играм
> слабо относится.
Основная конференция подойдет?<
← →
JUS (2004-08-17 21:52) [6]
> Алхимик
благодарю:)
← →
CoolProger:DWORD; (2004-08-17 21:53) [7]это вопрос про ОПП, тебе надо в основной форум а не в игрушки, и книги надо читать больше, тогда флуда будет меньше
← →
JUS (2004-08-17 22:17) [8]А вот в стратегиях как делают? К примеру нажимаеш построить сотдата, ещё одного и еще человек 10... Лимит 200 солдат.В программе что пишут класс для каждого солдата ? или хватает одного класса солдата?
← →
Servelat © (2004-08-17 22:19) [9]Хватает одного...
← →
JUS (2004-08-17 23:17) [10]Я имею в виду не типа Heroes of magic где и я могу сделать кол-во людей как Копейщик:=Копейщик+1; а например в C&C Red Alert
Ты надеюсь так и понял.
← →
JUS (2004-08-17 23:49) [11]_
← →
Гаврила © (2004-08-18 00:04) [12]
> И для чего нужен Published? это типа свойства как в object
> ispectore?
Не совсем так. Это свойства, доступ к которым можно получить в RunTime по имени свойства или по индексу.
По имени имеется в виду в виде строковой переменной.
Ну и, соответственно, инспектор работает через них
← →
jack128 © (2004-08-18 00:37) [13]
> А вот в стратегиях как делают? К примеру нажимаеш построить
> сотдата, ещё одного и еще человек 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 объект - это отряд. Там нет такого понятия как отдельный солдат, там все мереется отрядами..
Кривовато написал, но надеюсь поймешь..
← →
JUS (2004-08-18 01:23) [14]Да, то что ты написал я понял, но вопрос
попытаюсь правильно сформулировать
Я создал класс отряд ТПехотинец скажем, могу описать в программе
var Пехотинец1.ТПехотинец;
Begin
...
end;
var Пехотинец2.ТПехотинец;
Begin
...
end;
var Пехотинец3.ТПехотинец;
Begin
...
end;
Ну а программно через кнопку Button как мне создать Пехотинца4, 5, 6...?
и как мне потом к ним обращаться?
← →
JUS (2004-08-18 10:50) [15]_?
← →
Skyle © (2004-08-18 10:59) [16]
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 11:52) [17]
А вот
TSoldat=class
...
Constructor create(N:Integer); //где N - номер солдата
end;
..
var I:integer;
...
IF key=vk_(кнопка построения солдака) Then Begin TSoldat.Create(N); i:=i+1; ... end;
такой пример не подходит или глупый пример?
← →
Рамиль © (2004-08-18 11:53) [18]
> IF key=vk_(кнопка построения солдака) Then Begin TSoldat.Create(N);
> i:=i+1; ... end;
И хде ты потом солдат искать будешь?...
← →
JUS (2004-08-18 11:54) [19]забыл N:=i;
← →
JUS (2004-08-18 11:57) [20]
> > 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;
← →
Рамиль © (2004-08-18 11:59) [21]Где ты ссылку на объект возьмешь?..
← →
Рамиль © (2004-08-18 12:00) [22]
> TSoldat.Create.TX:=X;
И с каких это пор конструктор записью является? Или он у тебя объект?
← →
JUS (2004-08-18 12:02) [23]:)
Понял
← →
Skyle © (2004-08-18 12:29) [24]
> [22] Рамиль © (18.08.04 12:00)
А чем вам не нравится эта строка?
← →
Рамиль © (2004-08-18 12:35) [25]
> [24] Skyle © (18.08.04 12:29)
> Constructor create(N:Integer); //где N - номер солдата
← →
Labert © (2004-08-18 12:51) [26]>Рамиль © (18.08.04 12:00) [22]
>И с каких это пор конструктор записью является? Или он у тебя объект?
Такие конструкции вполне допустимы в Delphi, кстати. В Java они называются анонимные объекты
procedure TForm1.Button1Click(Sender: TObject);
begin
TButton.Create(self).Parent := self
end;
← →
Рамиль © (2004-08-18 12:54) [27]Хм... Не задумывался, однако, действительно. Век живи - век учись:)
← →
JUS (2004-08-18 14:08) [28]Значит
TSoldat.Create(N);
я был всетаки прав?
X:=TX;
TSoldat.Create.TX:=X;
А вот
>
> //Теперь пехотинцы 2 и 5 идут нафик
> TFootman(Footmans[1]).GoFarFarAway;
> TFootman(Footmans[4]).GoFarFarAway;> finally
> //Освободить всех пехотинцев и Footmans
> end;
.GoFarFarAway; -это зарезервированная функция делфи или что это?
← →
Anatoly Podgoretsky © (2004-08-18 14:12) [29]Рамиль © (18.08.04 12:54) [27]
Конструктор Create возвращает объектовую ссылку.
← →
JUS (2004-08-18 14:25) [30].GoFarFarAway; -это зарезервированная функция делфи или что это?
← →
Skyle © (2004-08-18 14:25) [31]
> .GoFarFarAway; -это зарезервированная функция делфи или
> что это?
Имелся ввиду какой-то метод TFootman.
← →
JUS (2004-08-18 14:27) [32]Ага, понял!
← →
Jus (2004-08-18 21:06) [33]
> Skyle © (18.08.04 10:59) [16]
> 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);
ПишуFootmans.Add(TFootman.Create);
Add - не работает или (ADD) тоже имелся ввиду какой-то метод ?
← →
Jus (2004-08-18 21:47) [34]В какой раздел в описании класса TCar нужно отнести к примеру Speed чтобы мне через кнопку Button1 изменить его значение?
Вот фрагментTCar=class
Private
name:string;
fuel:integer;
speed:integer;
massa:integer;
public
constructor Create;
destructor Destroy;
end;
У меня значение SPeed не меняется при нажатии Button1 хотя должно, я правдо ещё могу ошибатся
Я подумал может Speed надо в свйства(т.е. вPublished
)? тогда будет всё хокей?
← →
akvilon © (2004-08-18 23:26) [35]к тому что находится в разделе Private имеют доступ только методы класса, чтобы менялось при нажатии на Button1 размещай данные в разделе Public, тогда они будут доступны везде
← →
JUS (2004-08-19 19:30) [36]Щас сделаю...
← →
Skyle © (2004-08-20 06:44) [37]
> Add - не работает
И что там сломалось?
← →
Jus (2004-08-20 20:29) [38]
> И что там сломалось?
Это что, юмор такой?:)
← →
Рамиль © (2004-08-20 21:42) [39]
> Это что, юмор такой?:)
Какой же это юмор? Add самое сабое место, постоянно ломается, достало уже...
← →
Jus (2004-08-20 21:43) [40]
> > Add - не работает
Да уже всё работает нормально, я просто коечто упустил в тексте программы... спасибо
Страницы: 1 2 вся ветка
Форум: "Основная";
Текущий архив: 2004.09.05;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.031 c