Форум: "Основная";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];
ВнизВопрос по экземплярам классов Найти похожие ветки
← →
Антоныч (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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.055 c