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

Вниз

Я пытаюсь вникнуть в ООП, возникли вопросы. Помогите!   Найти похожие ветки 

 
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:="транспотное средство", В TVaz Name я закоментировал, значит по идее при нажатии 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;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.029 c
4-1090560038
mail
2004-07-23 09:20
2004.09.05
Возможно ли размещение Image в rtfedit


3-1092192424
AZ
2004-08-11 06:47
2004.09.05
Медленная работа с таблицами


1-1092834830
Phoenix
2004-08-18 17:13
2004.09.05
Индивидуальные иконки в TreeView


1-1092735170
Боян Георгиев
2004-08-17 13:32
2004.09.05
Как показать содержание TJpegImage-a


3-1092115903
MadGhost
2004-08-10 09:31
2004.09.05
Есть ли такой SQL-сервер (маленький) чтобы его можно было вместе