Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Объектно-ориентированное программирование 
:(
    Опции темы
dawystrik
Дата 23.3.2009, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 23.3.2009

Репутация: нет
Всего: нет



Вот дано такое задание:
Постановка задачи:
1. Создать класс - транспортные средства, имеющий имя и способ передвижения.. Определить конструктор, деструктор и методы доступа (чтения и записи) к полям класса. 
Создать два производных класса:
Класс – пароход, имеющий имя, двигатель, грузоподъемность.
Класс – самолет, имеющий имя, двигатель, дальность полета.
Определить конструкторы, деструкторы, методы доступа (чтения и записи) имени, двигателя, грузоподъемности, дальности полета.
Создать экземпляры объектов всех классов.
В методах доступа к данным класса предусмотреть вывод сообщений поясняющих, метод какого класса вызывается.Написать программу, демонстрирующую различные виды переопределения свойств.
2. Программа должна быть реализована в виде модуля (Realiz.pas) и основной программы (Lab3_main.pas).
3. Свойства, объявленные в производных классах должны иметь такой же идентификатор, как и у свойств родительского класса.
При переопределении свойств необходимо изменить:
• Область видимости родительского свойства;
• Спецификаторы доступа родительского свойства;
4. В реализации программы должен быть предусмотрен вывод значения, спецификатора доступа(read, write) и области видимости (public, protected, private) родительского и переопределенного в производных классах свойства.
Вот мой код:
Код

unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    RadioButton1: TRadioButton;
    RadioButton2: TRadioButton;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    procedure Button1Click(Sender:TObject);
    procedure Button2Click(Sender:TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
   TTransp_sred = class
     private
       fName:string;
     protected
       procedure SetP(const new_name: string);
     public
       constructor Create(Name:string);
       Destructor Destroy; override;
       function Get:string;
     published
       property name:string read Get write SetP;
   end;
   TParohod = class(TTransp_sred)
     private
       fGruzopod1:string;
       fDvigatel1:string;
     protected
       procedure SetP(const new_name: string);
       function Get:string;virtual;
     public
       constructor Create(name:string; Gruzopod1:string; Dvigatel1:string);
       Destructor Destroy; override;
     published
       property Gruzopod1:string read Get write SetP;
   end;
   TSamolet = class(TTransp_sred)
     private
       fGruzopod2:string;
       fDvigatel2:string;
     protected
       procedure SetP(const new_name: string);
       function Get:string;virtual;
     public
       constructor Create(name:string; Gruzopod2:string; Dvigatel2:string);
       Destructor Destroy; override;
     published
       property  Gruzopod2:string  read Get write SetP;
   end;
const
   SZL = 20;
var
  Form1: TForm1;
  List:array[1..SZL] of TTransp_sred;
  n:integer = 0;
 
implementation
 
{$R *.dfm}
 
constructor TTransp_sred.Create(Name:string);
   begin
        fName:=name;
   end;
Destructor TTransp_sred.Destroy;
begin
end;
constructor TParohod.Create(Name:string; Gruzopod1:string; Dvigatel1:string);
   begin
        inherited create(name);
        fGruzopod1:=Gruzopod1;
        fDvigatel1:=Dvigatel1;
   end;
Destructor TParohod.Destroy;
begin
end;
constructor TSamolet.Create(Name:string;Gruzopod2:string;Dvigatel2:string);
   begin
        inherited create(name);
        fGruzopod2:=Gruzopod2;
        fDvigatel2:=Dvigatel2;
   end;
Destructor TSamolet.Destroy;
begin
end;
function TTransp_sred.Get:string;
   begin
        result:=fname;
   end;
procedure TTransp_sred.SetP;
begin
  fname:=new_name;
end;
function TParohod.Get:string;
   begin
        result:='Пароход' +' '+ fname + #13+'Грузоподъемность:' + fGruzopod1+ #13+
                'Двигатель:' + fDvigatel1;
   end;
procedure TParohod.SetP;
begin
  fname:=new_name;
end;
function TSamolet.Get:string;
   begin
        result:='Самолет'+' '+fname + #13+'Грузоподъемность:' + fGruzopod2+#13+
                'Двигатель:' + fDvigatel2;
   end;
procedure TSamolet.SetP;
begin
  fname:=new_name;
end;
procedure TForm1.Button1Click(Sender:TObject);
   begin
       if n < SZL then
          begin
              n:=n+1;
              if RadioButton1.Checked
                 then
                     List[n]:=TSamolet.Create(Edit1.Text,Edit2.Text,Edit3.Text)
                 else
                     List[n]:=TParohod.Create(Edit1.Text,Edit2.Text,Edit3.Text);
              Edit1.Text:='';
              Edit2.Text:='';
              Edit3.Text:='';
              Edit1.SetFocus;
          end
       else ShowMessage('Список заполнен!');
end;
procedure TForm1.Button2Click(Sender:TObject);
var
   i:integer;
   st:string;
begin
   for i:=1 to SZL do
      if list[i] <> NIL then
                     st:=st + list[i].Get + #13;
   ShowMessage('Список'+#13+st);
end;
end.

Результат выдает немного не тот который должен быть,вместо 3 значений(Название,грузоподъёмность,Двигатель) выдает только одно.А вместо того,чтобы выдавать по функции Get - выдает только то,что я ввела,то есть должно выводить,например
"Самолет ЕГ152,Грузоподъемность:123,Двигатель:ракетный"
выдает
"ЕГ152" или "123" или "ракетный".
Помогите найти ошибку!!!



Это сообщение отредактировал(а) dawystrik - 23.3.2009, 15:34

Присоединённый файл ( Кол-во скачиваний: 2 )
Присоединённый файл  2.rar 172,99 Kb
PM MAIL   Вверх
CodeMonkey
Дата 23.3.2009, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Два разных свойтсва Name и Gruzopod1 используют методы с одним и тем же именем: Get. Нехорошо. Назовите их как-нибудь типа GetName и GetGruzopod1.
Кроме того, не совсем ясно, откуда у самолёта грузоподъёмность (нет в условиях задачи).
Далее, совсем уж не ясно, почему метод Get для свойства Name или Gruzopod1 (не знаю, к кому вы хотели его прикрепить) возвращает полное описание объекта, вместо одного его свойства.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
dawystrik
Дата 23.3.2009, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 118
Регистрация: 23.3.2009

Репутация: нет
Всего: нет



насчёт Get я согласна,надо перименовать,но как потом вызывать её??
"Кроме того, не совсем ясно, откуда у самолёта грузоподъёмность (нет в условиях задачи)."-какая разница??
"Далее, совсем уж не ясно, почему метод Get для свойства Name или Gruzopod1 (не знаю, к кому вы хотели его прикрепить) возвращает полное описание объекта, вместо одного его свойства."-не поняла вопроса...
PM MAIL   Вверх
CodeMonkey
Дата 23.3.2009, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 29
Всего: 89



Цитата(dawystrik @  23.3.2009,  18:29 Найти цитируемый пост)
,но как потом вызывать её??

ээээ... а зачем вам вызывать геттер напрямую? Он вызывается автоматически, когда вы трогаете свойство.

Код
    property Name: String read GetName write SetName;
...
    property Gruzopod: Extended read GetGruzopod write SetGruzopod;
...
  ShowMessage('Имя объекта: ' + Obj.Name + // здесь будет вызов GetName
                          ', грузоподъёмность: ' + FloatToStr(Obj.Gruzopod) + ' кг'); // а здесь - GetGruzopod


Цитата(dawystrik @  23.3.2009,  18:29 Найти цитируемый пост)
какая разница??

Т.е. как это "какая разница"? А как, по-вашему, мы можем понять, что же вы хотели сделать?

Добавлено через 5 минут и 41 секунду
Цитата(dawystrik @  23.3.2009,  18:29 Найти цитируемый пост)
не поняла вопроса

Код
  property Gruzopod1:string read Get write SetP;


Отсюда следует, что Get должен возвращать грузоподъёмность.
Читаем:
Код
function TParohod.Get:string;
   begin
        result:='Пароход' +' '+ fname + #13+'Грузоподъемность:' + fGruzopod1+ #13+
                'Двигатель:' + fDvigatel1;
   end;


Откуда следует, что реально он возвращает описание объекта целиком, а вовсе не только грузоподъёмность.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0516 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.