Переключение на Главную Страницу Страницы: 1 ... 7 8 [9] 10 11 ... 13 ОтправитьПечать
Очень популярная тема (более 25 ответов) Полиморфизм ЗаменитьЭксзБазовогоКласса (число прочтений - 86105 )
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #120 - 01. Июня 2006 :: 05:40
Печать  
kms писал(а) 31. Мая 2006 :: 21:46:
fez
Федор, я еще раз подумал. Я поддерживаю твой вариант.
ЗаменитьБазовыйОбъект() должен являться виртуальной функцией, определенной во всех классах.
И, соответственно, должен работать со всей иерархией.

Ну наконец-то... Уфф..

В качестве ответной любезности - делюсь примером, когда Цитата:
"Переопределение" же ЗаменитьЗксзБазовогоКласса в корне изменит поведение суперкласса, если тот полагается на определенную работу ЗаменитьЭксзБазовогоКласса().


Итак.
1. Есть класс "НевиртуальныйКласс", который полагается на определенную работу ЗаменитьЭксзБазовогоКласса. При этом эта самая работа метода спряна внутри некоторого экспортного метода класса. Назовем его "МетодИнициализации()".
2. У "НевиртуальногоКласса" есть базовый класс "БазовыйКласс". Иначе нам просто нечего будет заменять.
3. Мы наследуем от "НевиртуальногоКласса" класс "НаследникДокумента". Вторым родителем "НаследникаДокумента" будет "ПростоДокумент".
4. Самый важный момент. Мы хотим использовать "МетодИнициализации" в целях класса "НаследникДокумента". И не просто использовать, а переопределить его. Использовать только интерфейс метода, забив на реализацию.

Собственно, тут нас грабли и поджидают. Ибо правильно было бы не полностью переопределить, а дополнить функционал метода. Тем или иным способом вызвав еще и метод"НевиртуальногоКласса".

Однако хочу отметить, что аналогичные грабли подстерегают любого, кто добавление функционала будет делать через полное переопределение.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #121 - 01. Июня 2006 :: 05:55
Печать  
sedmin
Во-первых, чтобы твои предложения не затерялись, ты пиши их в отдельную ветку.
sedmin писал(а) 01. Июня 2006 :: 04:55:
1. В defcls.prm  указывать только расположение файла класса. Все описание класса иметь в файле класса. В том числе  его иерархия, параметры по умолчанию, и т.д.
Примерно как в Яве.

Тема такая поднималась, но дело не пошло. Не помню, почему.

Цитата:
2. Иметь возможность загрузить все файлы классов из каталога. Опять же как в Яве.

Это, думаю, возможно. Но если делать, то делать оба пункта вместе.
По обоим пунктам перспективы туманные, т.к. не понятно, кто это будет делать.
Но в багзиллу написать можно.

Цитата:
Мое мнение: ну его нафиг, такое счастье. Давайте не будем делать того, в чем нет потребности. (Мантра экстемальных программистов: "Нам это никогда не понадобится".)

Да уж, зачем делать то в чем у вас нет потребности. Я критику просил, а не эмоциональное отношение.

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

Зачем это нужно.

Представь, у меня есть грубо многофирменная Торговля и разные Бухгалтерии (это базы).
Есть механизм переноса документов, который нужно сделать удобным и надежным.
Для этого мы объявляем интерфейс:
Цитата:
// основной класс обработки данных
class transfer
{
   [pure] virtual ФильтрФирм(); // это виртуальная или чисто виртуальная функция
   [pure] virtual ФильтрКонтрагентов();
   [pure] virtual КонверторСкладов();
}

// фильтр документов по фирме
// класс transfer_filter_firm
{
   virtual ФильтрФирм(); // конкретный фильтр по фирме
}

// фильтр документов по контрагенту
// класс transfer_filter_customer
{
   virtual ФильтрКонтрагентов();
}

// конвертор складов
// класс transfer_convertor
{
   virtual КонверторСклад();
}


В обработке переноса данных мы конструируем класс переноса в зависимости от текущей ситуации.
Нужен фильтр по фирме - пожалуйста, нужен фильтр по контрагенту - нате, нужна замена складов на один - нет проблем.

И заметь, это чистое ООП, без каких-либо нарушений, это полиморфизм в чистом виде.

Если у меня n фильтров и m конверторов, мне нужно описать всего m+n+1 классов, реализующих интерфейс.
Если делать сейчас, то мне потребуется m*n классов, которые будут описывать возможные сочетания.
Поэтому сейчас эта задача не реализуема красиво. Реально - вообще не реализуема.
Да, конечно, фильтры и конверторы можно делать в одной процедуре через параметры.
И еще можно в лаптях ходит и ездить на кобыле.

Кроме того, я уже высказывал идею насчет динамического создания модулей классов.
Сюда она также отлично вписывается.

Я уже практически не вижу возможности не реализовывать эти предложения.
Однако если в логике есть реальные проблемы, прошу высказываться.
Все мнения обязательно буду учитывать.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #122 - 01. Июня 2006 :: 06:10
Печать  
Цитата:
Однако хочу отметить, что аналогичные грабли подстерегают любого, кто добавление функционала будет делать через полное переопределение.

Это у вас, батенька, проблемы не с ЗаменитьБазовыйОбъект(), а с неаккуратным использованием замещения реализации интерфейса.
Ты представь, у тебя все переопределенные функции теперь работают неправильно.
Давай подумаем хорошенько, и не будем использовать такие опасные концепции, как полиморфизм и виртуальные функции!
Это же ужасно, когда ты привык, что в стакане вода, а тебе водки налили!

Э. Ты понял, это шутка была! Подмигивание
Я-то думал, у тебя что-то серьезное.

ЗаменитьБазовыйОбъект() мы реализуем сами внутри 1cpp, поэтому его реализация будет всегда корректна.
По остальным виртуалам нужно просто добавить механизм разрешения коллизий.
Примерно как c++ (это выглядело бы так):
Цитата:
virtual Подкласс::Инит()
{
   СуперКласс::Инит();
    // инит подкласса
    // ...
}

  

De quelle planète es-tu?
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #123 - 01. Июня 2006 :: 07:20
Печать  
kms писал(а) 01. Июня 2006 :: 05:55:
Я уже практически не вижу возможности не реализовывать эти предложения.
Однако если в логике есть реальные проблемы, прошу высказываться.
Все мнения обязательно буду учитывать.


Блин. Остапа понесло. Ну если тебе так хочется, то реализуй.

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

Цитата:
Представь, у меня есть грубо многофирменная Торговля и разные Бухгалтерии (это базы).


Представить я могу все что угодно. Тебе это действительно надо? Реализуй наиболее простым способом. Зачем при этом наворачивать дебри из С++? Лавры Страуструпа покоя не дают?

Лучше уж тогда идти по пути Явы. Там это, хотя бы, прозрачнее. Достаточно понять логику использования вложенных классов.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #124 - 01. Июня 2006 :: 07:30
Печать  
fez писал(а) 31. Мая 2006 :: 19:25:
kms писал(а) 31. Мая 2006 :: 19:19:
Насколько я сейчас представляю, Deb просто конструирует общий класс путем сливания в него всех подкласса и всех суперклассов с каким-то разрешением конфликтов (Артур сказал, что берется первый попавшийся метод с совпадающим именем).

Блин, вы что FAQ не читаете? Первый попавшийся...


Адвокат защиты: Улыбка
Цитата:
1. Мой подзащитный (Артур) считает, что неплохо разобрался с иерархией, когда поднимал тему на итланде о динамической иерархии, методе НазначитьБазовыйКласс и недостатках метода ЗаменитьБазовыйОбъект (невозможно было наследоваться от группового контекста).
2. попрошу учесть тот факт, что мой подзащитный
(Артур), если и говорил, что "берется первый попавшийся метод с совпадающим именем", то подразумевал как раз первый метод согласно иерархии классов/объектов, а не случайный выбор певрого попавшегося метода.


А вообще по динамической иерархиии очень много было сказано на итланде, тогда подавляющим большинством меня убедили от нее отказаться и я удалил метод НазначитьБазовыйКласс Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #125 - 01. Июня 2006 :: 07:42
Печать  
sedmin
Цитата:
Представить я могу все что угодно. Тебе это действительно надо? Реализуй наиболее простым способом. Зачем при этом наворачивать дебри из С++? Лавры Страуструпа покоя не дают?

Бл№, ну ни слова по делу.
Или переходи на конструктив, или нех#р высказываться, если нечего сказать. Злой
Не трать мое время впустую.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #126 - 01. Июня 2006 :: 07:43
Печать  
artbear
Цитата:
вообще по динамической иерархиии очень много было сказано на итланде, тогда подавляющим большинством меня убедили от нее отказаться и я удалил метод НазначитьБазовыйКласс

То, что было сказано на итланде (и НазначитьБазовыйКласс()) и то, что предлагается сейчас - это разные вещи. Присмотрись.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #127 - 01. Июня 2006 :: 07:56
Печать  
kms писал(а) 01. Июня 2006 :: 07:43:
artbear
Цитата:
вообще по динамической иерархиии очень много было сказано на итланде, тогда подавляющим большинством меня убедили от нее отказаться и я удалил метод НазначитьБазовыйКласс

То, что было сказано на итланде (и НазначитьБазовыйКласс()) и то, что предлагается сейчас - это разные вещи. Присмотрись.

ИМХО ты предлагаешь добавить динамическую иерархию (генерить ее на лету) - а мы в этой ветке как раз отказались от нее. Так что ты неправ. Можешь перечитать ветку на итланде Улыбка
По другим пунктам еще размышляю.
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer && tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #128 - 01. Июня 2006 :: 07:58
Печать  
sedmin
Вообще, я удивлен. Не так часто встречаю ответы, по отношению к которым не могу высказать никакого мнения.

Как можно высказывать и логически обосновывать мнение по отношению к чистым негативным эмоциям без информационной нагрузки?

Выражаю свое разочарование, power user sedmin.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #129 - 01. Июня 2006 :: 08:06
Печать  
artbear писал(а) 01. Июня 2006 :: 07:56:
ИМХО ты предлагаешь добавить динамическую иерархию (генерить ее на лету) - а мы в этой ветке как раз отказались от нее. Так что ты неправ. Можешь перечитать ветку на итланде Улыбка

Конечно, я изучу еще раз. Но я же сам отвечал там, я помню разговор.

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

De quelle planète es-tu?
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


I wanted to cry, but the
tears wouldn't come

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #130 - 01. Июня 2006 :: 08:09
Печать  
kms писал(а) 01. Июня 2006 :: 05:55:
Если у меня n фильтров и m конверторов, мне нужно описать всего m+n+1 классов, реализующих интерфейс.
Если делать сейчас, то мне потребуется m*n классов, которые будут описывать возможные сочетания.

Ээээ... Я сразу предупреждаю, что плотно не вчитывался, но мне что-то подсказывает, что это как раз тот самый случай, когда стоит отказаться от наследования и перейти на агрегирование.
Палычу привет Улыбка

P.S. Не ругайтесь, горячие эстонские парни. У меня все равно ругалка громче.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #131 - 01. Июня 2006 :: 08:26
Печать  
fez
Частично ты прав, я тоже привет Палычу Улыбка

Но это просто мой косяк в представлении информации - я хотел акцентировать внимание именно на полиморфные механизмы (переопределение методов).

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

Но еще есть класс "перенос по контрагенту с заменой склада". Как его сделать красиво на базе вышеперечисленных классов?
  

De quelle planète es-tu?
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #132 - 01. Июня 2006 :: 08:55
Печать  
kms писал(а) 01. Июня 2006 :: 07:58:
Выражаю свое разочарование, power user sedmin.


Можешь мне понизить ранг, я не против.  Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #133 - 01. Июня 2006 :: 09:03
Печать  
Лучше ты высказывайся по делу, если можешь.
Это будет вызывать у меня уважение. Все, давай закроем тему.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #134 - 01. Июня 2006 :: 09:06
Печать  
kms писал(а) 01. Июня 2006 :: 08:26:
Но еще есть класс "перенос по контрагенту с заменой склада". Как его сделать красиво на базе вышеперечисленных классов?


Вот-вот. А потом у тебя получится самолет с подвесным вооружением из трех танков.

По идеалогии Явы в основном классе надо сделать два вложенных класса, которые реализуют разные интерфейсы. И пользоваться этими классами. Тоже неплохое решение. Даже лучше того, что ты предложил. Может его реализовать?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 7 8 [9] 10 11 ... 13
ОтправитьПечать