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

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

Как создать функцию возвращающею разные типы? [D5, Win95/98, Win2k, WinXP]


Страницы:   1 2

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;


Страницы:   1 2

Наверх

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