![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как создать функцию возвращающею разные типы? [D5, Win95/98, Win2k, WinXP]
Erik1 © (2004-09-23 16:39:00)Я пробовал создать базовый клас и от него унаследовать 2 потомков в которых переопределить нужную функцию. Но будет ли это работать?
Базовый клас:
TActivItem = class
private
fItem: TObject;
fStart: TSystemTime;
fStatus: TReportStatus;
protected
fID: integer;
fDescription: string;
function GetItem: TObject; dynamic; abstract; //Общая функция
public
constructor Create(Value: TObject);
destructor Destroy; override;
procedure Cancel; dynamic; abstract;
end;
Потомок:
TVisThread = class(TActivItem)
protected
function GetItem: TCustomThread; overload;
public
procedure Cancel; override;
property Item: TCustomThread read GetItem;
end;
Второй потомок:
TVisReport = class(TActivItem)
private
fReportItem: TReportItem;
..........
protected
function GetItem: TBaseReport; overload; //override;
public
property Item: TBaseReport read GetItem;
end;
И использование:
TReportManager = class(TComponent)
......
public
property Items[Index: Integer]: TActivItem read GetItems write SetItems; default;
end;
В Items записываю нужный клас и всегда могу вызывать общие методы определеные в TActivItem. Насколько это правильно?
Defunct (2004-09-23 17:08:00) [21]> AbstractFamily1: TAbstractFamily1;
> Ну и как вызвать нужный GetItem?
Тупо:
AbstractFamily1 := TClass1Family2.Create;
где-то вызывается AbstarctFamily1.GetItem
вернет TAbstractFamily2
Erik1 (2004-09-23 17:02:00) [22]С функцией GetItems особых проблем нет, она возвращает тот клас который в ней записали:
function TReportManager.GetItems(Index: Integer): TActivItem;
begin
Result := fList[Index];
end;
Поскольку у них есть общий предок, то возможно всегда вызвать GetItem и вроде получить правильный обект(TBaseReport, TCustomThread)? Я парав?
Посмотриде внимательно на
function GetItem: TCustomThread; overload; а не override;
Digitman (2004-09-23 17:02:00) [23]
> Defunct © (23.09.04 17:00) [8]
вариантный тип - такой же равноправный тип как и все прочие типы
Sandman25 (2004-09-23 17:02:00) [24][5] Erik1 © (23.09.04 16:50)
Понятно. Тогда, действительно, следует оставить TObject.
[7] Defunct © (23.09.04 16:57)
AbstractFamily1: TAbstractFamily1;
Ну и как вызвать нужный GetItem?
Defunct (2004-09-23 17:00:00) [25]> ну и где здесь "разные типы" ? variant как был так и остался ..
дык, Variant тобиш, что надо то и будет.
Defunct (2004-09-23 16:57:00) [26]> Пихать класс в Variant? Это чтото не то.
Почему не то? прочитайте сами свой вопрос, который звучит "Как создать функцию возвращающею разные типы?"
> Вобщето я хотел устранить [Warning] uRepMgr.pas(55): Method 'GetItem' hides virtual method of base type 'TActivItem'
зачем это? -
function GetItem: TCustomThread; overload;
это как раз тот случай когда целесообразно использовать директиву reintroduce.
TAbstractFamily1 = class
Private
..
Function GetItem:TAbstractClass; virtual;abstract;
..
End;
..
TClass1Family1 = class(TAbstractFamily1)
Function GetItem:TAbstractClass; override;
End;
TAbstractFamily2 = class(TAbstractFamily1)
Function GetItem:TAbstractFamily2; reintroduce; virtual; abstract;
End;
и т.д.
Digitman (2004-09-23 16:50:00) [27]
> Defunct © (23.09.04 16:42) [1]
ну и где здесь "разные типы" ? variant как был так и остался ..
> Erik1
возвращай объект базового класса TActiveItem
код, вызвавший Items[], просто производит проверку и приведение типа
if MyResult is TVisThread then with TVisThread(MyResult) do..
else if MyResult is TVisReport then with TVisReport(MyResult) do..
Erik1 (2004-09-23 16:50:00) [28]to Sandman25
А накой? Мне то другое надо. Все началась с того, что я захотел одинаково работать с разного типа данным, классы тоже относятся в таком случае к данным. Например у меня есть отчеты и потоки, но методы их завершения у них обшие.
Sandman25 (2004-09-23 16:49:00) [29]А вообще вместо GetItem: TObject нужно использовать GetItem: TAbstractItem, в котором куча виртуальных методов.
Erik1 (2004-09-23 16:47:00) [30]Пихать класс в Variant? Это чтото не то. Вобщето я хотел устранить [Warning] uRepMgr.pas(55): Method 'GetItem' hides virtual method of base type 'TActivItem'
Sandman25 (2004-09-23 16:45:00) [31]Вместо
protected
function GetItem: TBaseReport; overload; //override;
Нужно
public
function GetItem: TObject; override;
Defunct (2004-09-23 16:42:00) [32]Function F:Variant;