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

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

Вопрос по экземплярам классов [D7, WinXP]


Антоныч ©   (2004-12-07 17:32:00) 

Помогите, возник такой вопрос.
Допустим, имеются 2 классa: Class1=class (TObject) и Class2=class (TObject) (различные).

Также имеется некоторая переменная MyObj – экземпляр класса в дальнейшем.
Для того, чтобы она стала экземпляром, необходимо произвести действия:
var MyObj: Class1;
...
MyObj:=Class1.Create;

Теперь MyObj – экземпляр класса Class1. Аналогично и для Class2.

Так вот, вопрос в следующем: можно ли сделать так, чтоб в процессе выполнения программы (например, на этапе создания формы), переменная MyObj становилась бы экземпляром класса либо Class1, либо Class2 (в зависимости от некоторого условия). Вообще, у меня вся загвоздка в том, какого типа её объявить в разделе var.

Заранее благодарен за содержательные ответы.


MBo   (2004-12-07 18:46:00) [1]

type
 TMan=class
   function Name:string;virtual;abstract;
 end;

 TVasya=class(TMan)
   function Name:string;override;
 end;

 TPetya=class(TMan)
   function Name:string;override;
 end;

implementation

procedure TForm1.Button1Click(Sender: TObject);
var
 Man:TMan;
begin
 if Odd(GetTickCount) then
   Man:=TVasya.Create
 else
   Man:=TPetya.Create;

 Caption:=Man.Name;

 Man.Free;
end;

{ TPetya }

function TPetya.Name: string;
begin
 Result:='Petya';
end;

{ TVasya }

function TVasya.Name: string;
begin
 Result:='Vasya';
end;


Антоныч   (2004-12-07 18:30:00) [2]

2 Александр Иванов:
Так работает, но все-равно не пойдет. Мне при каждом обращении к методам класса надо явно указывать, экземпляр какого класса MyObj:
(MyObj as Class1).Marka:='fdsfdfg';
необходимо один раз однозначно соотнести, чтоб затем в программе просто обращаться: MyObj.Marka:='121';

2 MBo:
Создать общего родителя - можно, но мне переделывать всю прогу придется полностью, а она и так неслабая :)).
Про полиморфизм читал, знаю и использую, но как-то не пойму, где его здесь можно употребить. Может, не до конца уловил суть :).


MBo   (2004-12-07 18:14:00) [3]

Создай общего родителя, обладающего полями и методами, общими для обоих классов-наследников.
И обязательно почитай о ПОЛИМОРФИЗМЕ


Александр Иванов   (2004-12-07 18:12:00) [4]

(MyObj as Class1).Marka:='fdsfdfg';


Рамиль   (2004-12-07 18:05:00) [5]


>procedure TForm1.FormCreate(Sender: TObject);
>begin
> MyObj:=Class1.create;
> MyObj.Marka:='121';
> end;


TClass1(MyObj).Marka:='121


Антоныч   (2004-12-07 18:01:00) [6]

попробовал, тогда почему-то не видит полей, методов и свойств класса.

Class1=class(TObject)
 private
   FMarka: string;
   function GetMarka: string;
   procedure SetMarka(const Value: string);
 published
   constructor create;
   destructor destroy; override;
   property Marka: string read GetMarka write SetMarka;
 end;

var
 Form1: TForm1;
 MyObj: TObject;

implementation

constructor Class1.create;
begin
 inherited;
end;

destructor Class1.destroy;
begin
 destroy;
end;

function Class1.GetMarka: string;
begin
 Result:=FMarka;
end;

procedure Class1.SetMarka(const Value: string);
begin
 FMarka:=Value;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 MyObj:=Class1.create;
 MyObj.Marka:='121';
end;

Marka - Undeclared identifier   :(((


Александр Иванов   (2004-12-07 17:36:00) [7]

TObject, тогда ее можно использовать и так и так.


Наверх

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