Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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:="транспотное средство", В 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.031 c
3-1092217638
zse
2004-08-11 13:47
2004.09.05
в MS SQL Serv хранимая процедура


4-1090504357
Muchacho
2004-07-22 17:52
2004.09.05
как сопоставить номер каждому файлу в папке?


1-1092912806
STARfish
2004-08-19 14:53
2004.09.05
Как обработать клик по ScrollBox, по его полосе прокрутки?


1-1092905242
ferr
2004-08-19 12:47
2004.09.05
WebBrowser


1-1092914626
som
2004-08-19 15:23
2004.09.05
Горячий выход с программы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский