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

Вниз

Вопрос по экземплярам классов   Найти похожие ветки 

 
Антоныч   (2004-12-07 17:32) [0]

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

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

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

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

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


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

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


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

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

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 18:05) [3]


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


TClass1(MyObj).Marka:="121


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

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


 
MBo ©   (2004-12-07 18:14) [5]

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


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

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

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


 
MBo ©   (2004-12-07 18:46) [7]

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;



Страницы: 1 вся ветка

Текущий архив: 2004.12.19;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.025 c
3-1100752786
Vladik
2004-11-18 07:39
2004.12.19
Настройки соединения для ADO


4-1099409218
Vladik
2004-11-02 18:26
2004.12.19
Что тут неверно в функции API


1-1102154959
sten
2004-12-04 13:09
2004.12.19
не разрушается обьект !


14-1101488372
Alex_Petr
2004-11-26 19:59
2004.12.19
На тему давления авторитетом.


3-1100690038
_mandrake_
2004-11-17 14:13
2004.12.19
sql снифер