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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #135 - 01. Июня 2006 :: 09:13
Печать  
А что такое вложенный класс? Агрегация?
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #136 - 01. Июня 2006 :: 09:15
Печать  
kms писал(а) 01. Июня 2006 :: 08:26:
Есть общий класс "перенос".
Класс "перенос по фирме", "перенос по контрагенту", "перенос с заменой склада" - это именно частные случаи переноса. Они все являются переносами!

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

Можно я просто попробую сделать красиво? Ибо условие "на базе вышеперечисленных классов" - слишком жесткое.

Есть класс "Перенос". Есть классы "ФильтрПоФирме", "ФильтрПоКонтрагенту". Есть класс "ЗаменаСклада".
В классе "Перенос" реализован общий механизм переноса, и вставлены вызовы всех фильтров и замен. Каждый фильтр и замена может находиться в разных состояниях: вкл. и выкл. По умолчанию - выкл. При включении фильтра или замены туда передаются необходимые параметры.

Ку?

P.S. Еще раз читаем sedmin'а
Цитата:
Реализуй наиболее простым способом.
и Цитата:
Достаточно понять логику использования вложенных классов.
и видим, что сказал он фактически то же самое, только короче.
  
Наверх
www  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #137 - 01. Июня 2006 :: 09:16
Печать  
Всю ветку не осилил, много букв.
Имею сказать следующее:
Скорее всего, ЗаменитьЭкземплярБазовогоКласса, ищет базовый класс по одинаковому алгоритму с ПолучитьБазовыйКласс. Который в свою очередь, Deb по моей просьбе сделал НЕПОЛИМОРФНЫМ, то есть поиск ВСЕГДА ведется начиная от класса, из которого был вызов, а не из конечного класса.
Поясняю, для чего это нужно:
Допустим, у меня есть базовый класс
   Регистры
, с неким общим функционалом. От него наследованы
   Регистр_Товары,
   Регистр_Взаиморасчеты.
В своем коде они для обращения к методам базовых классов используют
   ПолучитьБазовыйКласс("Регистры");
что совершенно естественно. Теперь я создаю класс
   Док_Продажа : Проведение, Регистр_Товары, Регистр_Взаиморасеты

До версии кажется 1.7.0.3 (а может и ранее), когда базовый класс искался начиная с последнего, в этом случае методы из Регистр_Взаиморасеты, пытаясь обратится к своему базовому классу, получали объект "Регистры" от класса Регистр_Товары, что приводило к ошибкам. Поэтому поведение ПолучитьБазовыйКласс было изменено,
с тем чтобы базовый класс всегда искался от вызывающего класса.
Возможно, причина в этом.

Федор, а не пробовал ты сделать так:
Код
Выбрать все
//В базовом классе:
Процедура Инит(Конт) Экспорт
    .... // Некая инициализация
    Сам(Контекст).СделатьЗамену(Конт);

// В наследниках
Процедура СделатьЗамену(Конт) Экспорт
    ЗаменитьЭкземплярБазовогоКласса(Конт);
 

  
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #138 - 01. Июня 2006 :: 09:23
Печать  
Демонстрация использования вложенных классов, которые в Яве заменяют CallBack функции.

Интерфейс УстановщикА {
   // Все методы, само собой, экспортные
   Процедура УстановитьА(НовоеА) Далее
}

Класс СложныйКласс {
 Перем а;

 Класс ВложенныйКласс Реализует УстановщикА {
   Процедура УстановитьА(НовоеА) Экспорт
       а=НовоеА;
   КонецПроцедуры
 }

 Функция ПолучитьУстановщикА() Экспорт
    Возврат СоздатьОбъект("ВложенныйКласс");
 КонецФункции
}

О=СоздатьОбъект("СложныйКласс");
О.ПолучитьУстановщикА().УстановитьА(5);
Сообщить(О.ПолучитьА());
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #139 - 01. Июня 2006 :: 09:24
Печать  
orefkov писал(а) 01. Июня 2006 :: 09:16:
Теперь я создаю класс
  Док_Продажа : Проведение, Регистр_Товары, Регистр_Взаиморасеты

Ща придет Палыч и будет ругаться Улыбка

Цитата:
Федор, а не пробовал ты сделать так:

Нет, а зачем? Я как раз хочу уйти от необходимости писать один и тот же ЗаменитьЭксзБазовогоКласса() в каждом наследнике, а ты предлагаешь мне обратно к этому вернуться.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #140 - 01. Июня 2006 :: 09:25
Печать  
Блин, сначала скажите мне вот это:

просьба
А поясните мне, зачем нужно
Цитата:
В своем коде они для обращения к методам базовых классов используют
  ПолучитьБазовыйКласс("Регистры");


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

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #141 - 01. Июня 2006 :: 09:30
Печать  
kms писал(а) 01. Июня 2006 :: 09:25:
Но проблема не в полиморфизме, а в технологии разрешения ромбовидного наследования.

В данном конкретном случае как раз от наследования надо вообще уходить, кмк.
Документ никак не является регистром. Документ содержит в себе движения регистров. От этого и плясать.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

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

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #143 - 01. Июня 2006 :: 09:35
Печать  
Имхается мне Федор, не надо делать полиморфизм в ЗаменитьЭкземплярБазовогоКласса.
Представь иерархию из прошлого примера:
Строение класса Док_Продажа
Код
Выбрать все
Проведение   Регистры		Регистры
     |	    |			 |
     |     Регистр_Товары   Регистр_Взаиморасчеты
     |	    |			 |
     --------------------------------
			  |
		   Док_Продажа
 


Если в каком-то из методов класса Регистр_Взаиморасчеты сделать ЗаменитьЭкземплярБазовогоКласса("Регистры"), то при полиморфном выполнении поиск класса регистры начнется с Док_Продажа, слева направо, снизу вверх, и заменит что? Регистр_Товары -> Регистры.

Согласись, это не гуд. Класс не должен зависеть от того, куда его потом встроят.
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #144 - 01. Июня 2006 :: 09:36
Печать  
kms писал(а) 01. Июня 2006 :: 09:33:
проблему он четко обрисовал.

Он обрисовал проблему с ПолучитьБазовыйКласс(). Эта проблема мне понятна, и насколько я понял - она решена.

Цитата:
Я тоже о ней писал.

А я от тебя хотел увидеть проблему с ЗаменитьЭксзБазовогоКласса(). Ее я так и не увидел.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

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

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #146 - 01. Июня 2006 :: 09:40
Печать  
fez писал(а) 01. Июня 2006 :: 09:36:
Ее я так и не увидел.

Ага. Теперь увидел.

Ромбовидное наследование - это ужасно. Даже и не знаю, что тут сказать.

Спрошу.
Если вдруг из модуля класса Док_Продажа потребуется как-то достучаться до того объекта "Регистры", который базовый для "Регистр_Взаиморасчеты"... Я правильно понимаю, что этого сделать вообще никак невозможно?
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #147 - 01. Июня 2006 :: 09:41
Печать  
fez писал(а) 01. Июня 2006 :: 09:36:
А я от тебя хотел увидеть проблему с ЗаменитьЭксзБазовогоКласса(). Ее я так и не увидел.

Я же сказал, что нет проблемы. Проблема в ромбах - ее и надо решать.
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #148 - 01. Июня 2006 :: 09:45
Печать  
kms писал(а) 01. Июня 2006 :: 09:41:
Проблема в ромбах - ее и надо решать.

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

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #149 - 01. Июня 2006 :: 09:49
Печать  
Блин, сначала скажите мне вот это:

просьба
А поясните мне, зачем нужно
Цитата:
В своем коде они для обращения к методам базовых классов используют
  ПолучитьБазовыйКласс("Регистры");


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

De quelle planète es-tu?
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 8 9 [10] 11 12 13
ОтправитьПечать