![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| NULL |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 137 Регистрация: 22.8.2003 Репутация: нет Всего: нет |
Что это такое?
|
|||
|
||||
| TaTaP |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 86 Регистрация: 15.10.2002 Репутация: 1 Всего: 1 |
В COM это такой класс с определенным интерфейсом, который может создавать классы. По идее только он и имеет право создавать новые объекты. Обычно реализуется разработчиком, т.к. только он в курсе того, как именно создаются его классы...
P.S. А вообще фабрика классов - это один из шаблонов проектирования... Как-то давно я писал программу, САМ придумал этот прием и был очень горд за себя, а оказалось, что это давным-давно все знают... |
|||
|
||||
| NULL |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 137 Регистрация: 22.8.2003 Репутация: нет Всего: нет |
т.е. можно во время работы аплета создавать новые классы.....
|
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Нет, можно создать новые экземпляры классов.
А в COM, это значит, что можно создать новые экземпляры объектов о которых тебе неизвестно ничего кроме их методов. |
|||
|
||||
| NULL |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 137 Регистрация: 22.8.2003 Репутация: нет Всего: нет |
а для чего нужно?
|
|||
|
||||
| DENNN |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3878 Регистрация: 27.3.2002 Где: Москва Репутация: 1 Всего: 43 |
Естественно, для того чтоб воспользоваться методами этих объектов
Обычно, ты сам не можешь (или не хочешь Если говорить о COM, то твоя программа совершенно не беспокоиться о том, где и как создан зарошенный тобой объект: внутри твоего процесса, на локальной машине или вообще где-то в сети. Она получает запрошенный объект, использует и возвращает назад. |
|||
|
||||
| NULL |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 137 Регистрация: 22.8.2003 Репутация: нет Всего: нет |
спасибо
|
|||
|
||||
| RAN |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Что значит "спасибо"? А я? Я тоже хочу поумничать
Чтоб не вдаваться в подробности COM. Смоделируем следующую задачу: Вы разработали программу, работающую с некоторым объектом реального мира. Например, это компьютерная игра в которой есть злые персонажи (управляемые Вашей прогой), бегающие за добрым (управляется user'ом). Написали класс для персонажа игры
Наследовали от этого класса кучу других (для разных типов персонажей). И тут Вам приходит мысль. А как бы сделать так, чтоб в будущем для добавления новых героев не надо было дорабатывать и перекомпилировать программу? А достаточно бы было написать для них новый класс и сразу использовать в редакторе миссий и игре. Тут решений, конечно много, но приведу одно, отражающее суть фабрики классов. Можно вынести реализацию классов персонажей в DLL или DLL'ы. И написать в ней фабрику классов. Обычно она реализуется отдельным классом. Вот как она могла бы выглядить в нашей программе (в COM фабрика имеет другой вид и жёстко определённый интерфес):
Теперь в DLL помещаем классы CEvilGnomePerson и CFrightPerson. И всё. То, как сделал я - не стандарт. Здесь каждый придумывает свой алгоритм. Сама DLL должна содержать глобальный экземпляр фабрики и функцию, возвращающую указатель на него.
Игра, загружаясь сама, загружает DLL и, вызвав GetPersonFactory, получает указатель на фабрику. Ну, дальше, я думаю, понятно. P.S. COM и IClassFactory - это отдельная история. |
||||||
|
|||||||
| Step |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5151 Регистрация: 26.9.2002 Где: дурдом.UA Репутация: 5 Всего: 25 |
RAN, проверю и пойдет наверное в факю
-------------------- - Дурак учится на своих ошибках, умный на чужих. - умные учатся у дураков |
|||
|
||||
| NULL |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 137 Регистрация: 22.8.2003 Репутация: нет Всего: нет |
RAN, полезная штука =)
|
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Вот еще одна схема реализации фабрики. Примечание : Это только набросок, а не рабочий код.
Здесь появление нового класса не затрагивает код фабрики, но перед использование фабрики класс нужно зарегистрировать
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| NULL |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 137 Регистрация: 22.8.2003 Репутация: нет Всего: нет |
Vyacheslav если я пральна понял объект TFabricClass может использовать методы TBaseClass1 и
TBaseClass..... типа наследует два класса? |
|||
|
||||
| RAN |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 709 Регистрация: 14.3.2003 Где: Щёлково Моск.обл. Репутация: 5 Всего: 6 |
Нет, там функции описаны как static. При регистрации класса адрес функции, создающей класс, запоминается в контейнере. Фабрика потом эту функцию вызывает. Никого наследования. P.S. Там, кстати, Vyacheslav очепятку допустил. Надо static void Register(string str, TCreateFunction fun) вместо static void Register(string str, TFunctionMap fun). |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
И возможно не одну. Этот код я уже приводил, и перенес обычным копированием из подобной же темы. И тогда я его набивал не лету. Так что возможны ошибки
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
| Vyacheslav |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2124 Регистрация: 25.3.2002 Где: Москва Репутация: 9 Всего: 59 |
Кстати в С++BuilderX появилась такая штука, как визард паттернов. Нужен тебе ,например, Singleton, нажимаешь кнопочку и шаблон к твоим услугам. Похоже в этот визард можно добавлять свои паттерны
-------------------- С уважением, Вячеслав Ермолаев |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |