Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Я пытаюсь вникнуть в ООП, возникли вопросы. Помогите! [Delphi]


Страницы:   1 2

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:='транспотное средство', В 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-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]

???


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо