Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];

Вниз

Виртуальный конструктор Create класса TComponent   Найти похожие ветки 

 
McSSN   (2006-08-02 13:11) [0]

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


 
Джо ©   (2006-08-02 13:12) [1]

А что вызывает удивление? Наличие виртуальных конструкторов вообще или наличие его у TComponent?


 
Юрий Зотов ©   (2006-08-02 13:18) [2]

> McSSN   (02.08.06 13:11)

function CreateComponent(AClass: TComponentClass; AOwner: TComponent): TComponent;
begin
 Result := AClass.Create(AOwner)
end;


 
McSSN   (2006-08-02 13:18) [3]

Не то чтобы удивление. Допускаю, что могу что-то не знать или не понимать.


 
Юрий Зотов ©   (2006-08-02 13:20) [4]

Дополнение насчет использования. Этот механизм используется, например, в самой VCL. Никто не мешает использовать его и нам тоже. Иногда это бывает нужно.


 
umbra ©   (2006-08-02 13:21) [5]


> существует ли для этого практическое применение ?
>

все, что видно на палитре компонентов в делфи - это следствие виртуальности конструктора TComponent


 
McSSN   (2006-08-02 13:24) [6]

Наверное, для того, чтобы это было возможно использовать, конструкторы классов должны иметь одинаковый вид?


 
McSSN   (2006-08-02 13:31) [7]

Спасибо.


 
Юрий Зотов ©   (2006-08-02 15:34) [8]

> McSSN   (02.08.06 13:24) [6]

Естественно. Они и имеют одинаковый вид, объявленный в классе TComponent. Если нужен другой вид, можно объявить новый виртуальный конструктор и метакласс (по типу TComponentClass).


 
Суслик ©   (2006-08-04 00:24) [9]


> все, что видно на палитре компонентов в делфи - это следствие
> виртуальности конструктора TComponent

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


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


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

Буквоед ;)


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

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

Песня!

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

Не верю!
:о)


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


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

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

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


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


> 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, так и самих компонетов.


 
Kolan ©   (2006-08-06 08:53) [14]


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

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

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


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


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

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


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


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

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


 
Kolan ©   (2006-08-06 22:46) [17]


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

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


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

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-07 00:40) [19]

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

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

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


> TConcreteClassA

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


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


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

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

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


 
Kolan ©   (2006-08-07 01:30) [21]


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

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


 
oxffff ©   (2006-08-07 14:26) [22]

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

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


 
oxffff ©   (2006-08-07 14:39) [23]

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

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


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


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

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


 
Kolan ©   (2006-08-07 18:37) [25]

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

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


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


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

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


 
Kolan ©   (2006-08-07 23:35) [27]


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


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

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;


Или что?


 
DiamondShark ©   (2006-08-08 00:11) [28]


> Или что?

Или что.

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

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


 
Kolan ©   (2006-08-08 00:31) [29]

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

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


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

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



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.53 MB
Время: 0.041 c
3-1152534624
Avgust
2006-07-10 16:30
2006.09.17
хм.. неустойчивый коннект..


15-1156396900
Александр Иванов
2006-08-24 09:21
2006.09.17
MS SQL Server 2005 Express Edition


2-1155647931
apic
2006-08-15 17:18
2006.09.17
Динамическое создание компонентов...


15-1156482508
КаПиБаРа
2006-08-25 09:08
2006.09.17
Право на получение платной услуги


15-1156330953
ArtemESC
2006-08-23 15:02
2006.09.17
Чтение дискетты...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский