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

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

Виртуальный конструктор Create класса TComponent


Страницы:   1 2

McSSN ©   (2006-08-02 13:11:00) 

Для чего классу TComponent Виртуальныйконструктор.
Т.е. существует ли для этого практическое применение ?


Kolan   (2006-08-08 00:31:00) [1]

Тогда вот у меня такой класс:

> TConcreteFactoryA = class(TAbstractFactory)
>     public function CreateClass(I: Integer): TAbstractClass;
>  override;
>  end;


Что я буду писать в скобках?

function TConcreteFactoryA.CreateClass(): TAbstractClass;
begin
 Result := TConcreteClassA.Create( ...);
    // заметьте, тут нет жеских требований
    // к набору параметров конструктора - он же не виртуальный :)
end;


DiamondShark   (2006-08-08 00:11:00) [2]


> Или что?

Или что.

Паттерн "Фабрика класса" подразумевает, что после опубликования интерфейса фабрики клиент без перекомпиляцииспособен пользоваться экземплярами классов, неизвестных на момент компиляции клиента.

Понятное дело, что опубликованный интерфейс уже меняться не может.


Kolan   (2006-08-07 23:35:00) [3]


> В каком смысле изменять?


Если мне надо так:

TConcreteClassA = class (TAbstractClass)
    //...потомок TAbstractClass, делающий что-то полезное
 end;

 TConcreteFactoryA = class(TAbstractFactory)
    public function CreateClass(I: Integer): TAbstractClass; override;
 end;


То будет:
[Pascal Error] Unit3.pas(30): E2037 Declaration of 'CreateClass' differs from previous declaration

Как поступать. Проектировать с учётом параметров? Те:
TAbstractFactory = class abstract (TObject)
     public function CreateClass(I: Integer): TAbstractClass; virtual; abstract;
  end;


Или что?


Суслик   (2006-08-07 22:58:00) [4]

В каком смысле изменять? Тебе его все равно нужно переопределять (override). Вот и реализуй в нем свою логику.


Kolan   (2006-08-07 18:37:00) [5]

Так а если конструктор у класса   TConcreteClassAбудет с параметрами, то и

> TConcreteFactoryA = class(TAbstractFactory)
>      public function CreateClass(): TAbstractClass; override;
>
>   end;


CreateClassтоже изменять надо?


Суслик   (2006-08-07 18:19:00) [6]


> Так что Delphi не променяю. Да и free pascal развивается

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


oxffff   (2006-08-07 14:39:00) [7]

А что касаемо виртуального конструктора и метаклассов, то Страуструп отдыхает.
Я тут как то кинул камень огород в С++ на gamedev.ru по поводу виртуального конструтора. Так какое началось.
Да и еще указатель на метод в С++(Visual) тоже изврат.
(простите меня за это но это факт).
Конечно в С++ есть свои достоинства.
это безусловно Шаблоны.
Хотя в CLR (.NET) появились делегаты.
Хотя и в СLR столько всего противоречивого.
Упаковка и распаковка размерных типов например.
Конечно  ничего сложного, но Реально за сборку мусора в CLR придется заплатить больше нужно знать столько нюансов, что уже и не захочется использовать CLR.

Так что Delphi не променяю. Да и free pascal развивается


oxffff   (2006-08-07 14:26:00) [8]

Кому уж так интересно про паттерны проектрования почитайте

Джон Влиссидес, Ральф Джонсон, Ричард Хелм, Эрих Гамма
"Приемы объектно-ориентированного проектирования. Паттерны проектирования".


Kolan   (2006-08-07 01:30:00) [9]


> Может я и ошибся :)

Не я же проверил - правильно "конкретный", но есть еще и "бетонный"...


Суслик   (2006-08-07 01:26:00) [10]


> Забавно, и не знал, что у этого слова несколько значений.
> .. Читаю млин - БетонныйКЛасс, БетоннаяФабрика :)

Ну я не такой спец в аглицком :) Может я и ошибся :)

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


Kolan   (2006-08-07 00:40:00) [11]

Наверно подумали, что я не спроста спросил

> А какие еще есть?

А мне просто интересно стало :). Благодарю за пример, а то господа из US все на C++ да на Java примеры в книгах пишут...


> T ConcreteClassA

Забавно, и не знал, что у этого слова несколько значений... Читаю млин - БетонныйКЛасс, БетоннаяФабрика :)


Суслик   (2006-08-07 00:28:00) [12]

1) фабрики классов

Библиотека


> type
>    TAbstractClass = class abstract (TObject)
>    end;

   TAbstractFactory = class abstract (TObject)
      public function CreateClass(): TAbstractClass; virtual; abstract;
   end;

   // Некий класс, который может работать с любыми потомками

   // TAbstractClass, в т.ч. и создавать их для своих нужд.

   TActivity = class
      public constructor Create(const aFactory: TAbstractFactory);

      public procedure Execute(); // некий метод, делающий
что-то
   end;

procedure TActivity.Execute();
var
   kC: TAbstractClass;
begin
   kC := fFactory.CreateClass();
   try
      ... некие операции с kC.
   finally
      kC.Free();
   end;
end;


Клиент библиотеки

type

  TConcreteClassA = class (TAbstractClass)
     ...потомок TAbstractClass, делающий что-то полезное
  end;
 
  TConcreteFactoryA = class(TAbstractFactory)
     public function CreateClass(): TAbstractClass; override;
  end;

function TConcreteFactoryA.CreateClass(): TAbstractClass;
begin
  Result := TConcreteClassA.Create(...);
     // заметьте, тут нет жеских требований
     // к набору параметров конструктора - он же не виртуальный :)
end;


2) фибричные методы.
Примерно тоже самое, но объекты создаются не отдельным классом, а виртуальным классом самого класса (в тек. пример - TActivity).


Kolan   (2006-08-06 22:46:00) [13]


> Согласитесь, что есть не менее сильные стредства инстанцирования,
>  чем виртуальные контрукторы.

А какие еще есть?


Суслик   (2006-08-06 11:06:00) [14]


> ух ты, какая вандерфульная дефиниция!

пользуйся!
я пока не запатентовал :)


DrPass   (2006-08-06 10:53:00) [15]


> полиморфного инстанцирования

ух ты, какая вандерфульная дефиниция!


Kolan   (2006-08-06 08:53:00) [16]


> инстанцирования

Блин, почему бы вместо этого слова не употреблять "Создание"(объекта, экземпляра), вместо "паттерн" - "шаблон"...

PS
 Правда я уже привык, но всеравно как-то не по русски.


Суслик   (2006-08-06 01:19:00) [17]


> DiamondShark ©   (04.08.06 00:43) [10]
> Юрий Зотов ©   (04.08.06 02:05) [11]


Господа. (без !)
Термин мб и мой, но верно отражает суть происходящего.

Согласитесь, что есть не менее сильные стредства инстанцирования, чем виртуальные контрукторы. В своих либах я стараюсь (если это не завязано на vcl) вирт. конт-ами не пользоваться.

-------

> Германн ©   (04.08.06 02:19) [12]

не знаю, и зать не хочу :)

------
to всем вышеперечисленным в текущем посте.

Ну согласитесь, господа, что пост

>umbra ©   (02.08.06 13:21) [5]
>все, что видно на палитре компонентов в делфи - это следствие >виртуальности конструктора TComponent

(на который я, собсно, и привел свой пост о полиморфном интсанцировании) не несет ничего крамольного (не знаю как это слово пишется). Вполне нормальные пост. Но! Складывается у меня ощущение, что автор возлагает на в. конструкторы слишком много заслуг.
В. конструкторы, конечно, дают много. Но (очередное)! Есть и другие среды разработки, не менее мощные, чем дельфи, которые основаны на языках, не имеющих виртуальных конструктров (далее, ВК). И никтое не мешает этим средам давать мощные средства как настройки IDE, так и самих компонетов.


Германн   (2006-08-04 02:19:00) [18]


> Юрий Зотов ©   (04.08.06 02:05) [11]
>
> "Полиморфное инстанцирование"...
>
> Песня!
>
> Неужели я понимаю, что означают эти слова?

А кто же, будучи в здравом уме, анализирует слова "песен"? :-)

Сорри эа флуд :-( Но Суслик вновь появился на форуме, имхо, недавно. И он не знает нынешнее толкование термина "буквоед"!


Юрий Зотов   (2006-08-04 02:05:00) [19]

"Полиморфное инстанцирование"...

Песня!

Неужели я понимаю, что означают эти слова?

Не верю!
:о)


DiamondShark   (2006-08-04 00:43:00) [20]


> это следствие полиморфного инстанцирования, а вирт. констр.
>  - это лишь одно из средств этого.

Буквоед ;)


Страницы:   1 2

Наверх

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