Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.03.2013, 17:25   #1
frosich
Пользователь
 
Регистрация: 10.03.2009
Сообщений: 15
По умолчанию Как создать метод класса, возвращающий объекты (поля класса) разных типов

Есть несколько классов
1. Родительский класс
2. Два дочерних класса
3. Класс содержащий в качестве полей оба дочерних от родительского класса, а также флаг определяющий какой из дочерних классов нужен в данном экземпляре.

Проблема в следующем, хочется написать функцию которая в зависимости от флага возвращала бы нужный объект. Поискав в инете нашёл тип variant, однако так и не нашёл как сделать так, чтобы в него можно было записывать объект.

для теста использовал следующий код:
Код:
unit Unit2;

interface

type TParentClass = class(TObject)
  protected
    Fa: integer;
  published
    property a: integer read Fa write Fa;
    constructor Create(va: integer); overload;
end;

type TClass1 = class(TParentClass)
  private
    Fb: double;
  public
    property b: double read Fb write Fb;
    constructor Create(va: integer; vb: double);  overload;
end;

type TClass2 = class(TParentClass)
  private
    Fc: string;
  public
    property c: string read Fc write Fc;
    constructor Create(va: integer; vc: string);  overload;
end;

type TNewClass = class(TObject)
  private
    a1: TClass1;
    a2: TClass2;
    fl: boolean;
  public
    function GetNeededObj: Variant;
    constructor Create(vObj: TClass1); overload;
    constructor Create(vObj: TClass2); overload;
end;

implementation

constructor TParentClass.Create(va: Integer);
begin
  a:=va;
end;

constructor TClass1.Create(va: integer; vb: double);
begin
  a:=va;
  b:=vb;
end;

constructor TClass2.Create(va: integer; vc: string);
begin
  a:=va;
  c:=vc;
end;

constructor TNewClass.Create(vObj: TClass1);
begin
  a1:=TClass1.Create;
  a1:=vObj;
  fl:=true;
end;

constructor TNewClass.Create(vObj: TClass2);
begin
  a2:=TClass2.Create;
  a2:=vObj;
  fl:=false;
end;

function TNewClass.GetNeededObj: Variant;
begin
  if fl then result:=a1
  else result:=a2;
end;

end.
Однако по указанной выше причине он не компилируется.
Вопрос: Как можно записать в variant объект? Если это невозможно, то возможно ли разрешить поставленную задачу не прибегая к нетипизированным указателям?
frosich вне форума Ответить с цитированием
Старый 01.03.2013, 18:12   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Обобщенным типом называется это(Generics). g00gL в помощь.
Человек_Борща вне форума Ответить с цитированием
Старый 01.03.2013, 18:36   #3
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,070
По умолчанию

Вместо
Код:
function GetNeededObj: Variant;
напиши вот так
Код:
function GetNeededObj: TParentClass;
У классов по сути один общий интерфейс, а если что-то будет специфическое для конкретного класса - сделай приведение типа.
И для чего создавать объект, при этом в дальнейшем его не удалять, а затем переназначать ссылку на другой объект...
Код:
constructor TNewClass.Create(vObj: TClass1);
begin
  a1:=TClass1.Create;
  a1:=vObj;
  fl:=true;
end;
Кстати, Человек_Борща, а точно ли уверен, что Generics смогут тут помочь? Как по мне, то они тут ни при чем...
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 01.03.2013 в 18:38.
spamer вне форума Ответить с цитированием
Старый 01.03.2013, 19:29   #4
frosich
Пользователь
 
Регистрация: 10.03.2009
Сообщений: 15
По умолчанию

Человек_Борща, насколько я понял в случае использования Generic получится две функции (разные имена), только описанные одинаково, однако я хотел бы создавать массив объектов типа TNewClass, а результат функции GetNeededObj передавать перегружаемой функции. Однако, всё равно спасибо, так как при программировании на C++ знал как воспользоваться этой возможностью, а на delphi всё никак не находил.
spamer, насчёт
Цитата:
И для чего создавать объект, при этом в дальнейшем его не удалять, а затем переназначать ссылку на другой объект...
согласен, тормознул.
Насчёт замены не понял, поля дочерних классов я так понимаю при возвращении просто пропадут? По крайней мере тест показывает что да.
Всем Спасибо, понял как в конкретном, интересующем случае обойтись без этой конструкции.

Последний раз редактировалось frosich; 01.03.2013 в 19:40.
frosich вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Считать из файла объекты разных типов (C++) whh Помощь студентам 1 26.11.2012 18:33
Доступ к полю класса из другого поля это класса NaumOff Общие вопросы Delphi 10 09.10.2012 09:53
Ошибка при присвоении объекту производного класса объекта базового класса с исп. явного приведения типов Lanx Помощь студентам 0 06.04.2011 20:24
ActionScript как создать метод класса? Kn793 JavaScript, Ajax 0 15.07.2009 15:32
как связать поля разных типов doncova1 Microsoft Office Access 5 11.03.2008 00:15