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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2012, 02:03   #1
hpple
Новичок
Джуниор
 
Регистрация: 26.12.2012
Сообщений: 2
По умолчанию как правильно использовать виртуальные конструкторы

У меня имеется некая иерархия классов:

TAbstractClass
|
...- TConcreteClassA
....|
.... -TConcreteClassA1
....|
...
|
...- TConcreteClassB
....|
.... -TConcreteClassB1
....|
...
|
...

Я планирую хранить все экземпляры в списке как TAbstractClass. И для их создания пользоваться виртуальными конструкторами,
причем у каждой ветви конкретного класса они будут отличаться (по аргументам, по их типам), а у каждой конкретной ветви иметь одинаковый набор. Как мне грамотно организовать процесс создания этих объектов извне? Грубо говоря, если бы все конструкторы
имели одинаковый вид я мог бы писать, как пример:

Код:
type 
  RefType = class of AbstractClass;
var
  Ref: RefType 
...

if ... then
  Ref:= TConcreteClassA1
else
  Ref:= TConcreteClassB1  

List.Add(Ref.Create);
Но в данном случае нет однозначного вида, как мне поступить?

Последний раз редактировалось hpple; 26.12.2012 в 02:05.
hpple вне форума Ответить с цитированием
Старый 26.12.2012, 02:18   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,434
По умолчанию

Посмотрите примеры этих классов в delphi, их там великое множество.
TObject, TThread

вот вам пример:
Код:
type
  TMyAbstractClass = class
  public
    constructor Create; overload; virtual; abstract;
    constructor Create(WithSuperData: INTEGER); overload; virtual; abstract;
  end;

  TAbstractionGoesHere = class(TMyAbstractClass)
  public
    constructor Create; overload;
    constructor Create(WithSuperData: INTEGER); overload;
  end;

...

{ TAbstractionGoesHere }

constructor TAbstractionGoesHere.Create;
begin
  //Construct me fully!
end;

constructor TAbstractionGoesHere.Create(WithSuperData: INTEGER);
begin
  //Construct me fully with INTEGER!!!11111
end;
Для TMyAbstractClass не нужна реализация его конструкторов, конструктора там кстати 2.
А вот родившемуся от него TAbstractionGoesHere необходимо точно так же описать конструкторы(оставить только overload ибо конструктора у нас 2), и создать эти методы и описать их.


Лучше к интерфейсам присмотритесь, там есть уже готовая реализация TInterfaceList у интерфецсов и абстрактных классов есть... ну они чем-то схожи.

Последний раз редактировалось Человек_Борща; 26.12.2012 в 02:23.
Человек_Борща вне форума Ответить с цитированием
Старый 26.12.2012, 02:34   #3
hpple
Новичок
Джуниор
 
Регистрация: 26.12.2012
Сообщений: 2
По умолчанию

Суть вопроса была в другом: меня интересует, как написать универсальный код именно для создания конкретных экземпляров в каком-то месте сторонней программы, которая их будет использовать, при условии, что сделать, как я привел выше нельзя, в силу того, что у разных подклассов разный вид конструкторов.

Только с помощью разделения процесса создания на использование конструктора без параметров и последующей инициации только что созданного объекта этими дополнительными данными?
hpple вне форума Ответить с цитированием
Старый 26.12.2012, 09:31   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,542
По умолчанию

Код:
if ... then begin
  Ref:= TConcreteClassA1;
  Add(ref.Create(p1);
end
else begin
  Ref:= TConcreteClassB1  
  Add(ref.Create(p1,p2);
end;

//List.Add(Ref.Create);
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно использовать MySQL EndoCrinolog PHP 6 24.08.2012 21:08
Виртуальные методы. Почему бы всегда не использовать их? haruhi Общие вопросы C/C++ 7 26.11.2011 16:44
Как правильно использовать MonthCalendar Shanuzina Компоненты Delphi 1 04.03.2010 11:58
как правильно использовать OR AND mpdasa Общие вопросы Delphi 2 19.01.2010 17:30
Кто сможет разъяснить как и зачем использовать виртуальные функции в C++? Dunhil Помощь студентам 5 20.12.2007 14:19