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


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Полиморфизм ЗаменитьЭксзБазовогоКласса
29. Мая 2006 :: 20:03
Печать  
Скажите, други.

Вот есть у нас документы. Мы расширяем функционал 1С-ных классов "Документ."+ВидДокумента с помощью оберток "Документ_"+ВидДокумента.
Из контекста самих документов расширенный функционал приходится использовать с помощью конструкции
Код
Выбрать все
_Сам = СоздатьОбъект("Документ_"+Вид());
_Сам.ЗаменитьЭксзБазовогоКласса("Документ."+Вид(), Контекст);
_Сам.ТутВызовМетодаРасширенногоФункционала(); 



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

Когда происходит вызов Сам(Контекст).ЗаменитьЭксзБазовогоКласса() в базовом классе (а хорошо звучит...), то экземпляр первоначального класса не заменяется. Логически мысля, я предполагаю, что происходит вызов метода ЗаменитьЭксзБазовогоКласса в контексте того класса, в котором он и написан, и не происходит его "полиморфичного" спуска вниз по дереву иерархии.

Вот сижу я тут и думаю: это баг или фича? Хочется послушать знатоков концепции ООП. Какого-нибудь deb'а, Палыча...
  
Наверх
www  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #1 - 30. Мая 2006 :: 03:52
Печать  
fez писал(а) 29. Мая 2006 :: 20:03:
Когда происходит вызов Сам(Контекст).ЗаменитьЭксзБазовогоКласса() в базовом классе (а хорошо звучит...), то экземпляр первоначального класса не заменяется. Логически мысля, я предполагаю, что происходит вызов метода ЗаменитьЭксзБазовогоКласса в контексте того класса, в котором он и написан, и не происходит его "полиморфичного" спуска вниз по дереву иерархии.


Вот этой фразы я не понял, хотя слова, вроде, все знаю. Даже ЗаменитьЭксзБазовогоКласса.  Улыбка

А может это просто баг возник на одной из сборок?
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #2 - 30. Мая 2006 :: 06:56
Печать  
Тут все же, наверное, не ООП в чистом виде, а именно момент реализации.
Надо будет разбираться, как замена реализована, думаю ты уже начал.

Вчера забыл сказать - ИМХО сложная это схема, я даже трезвый не сразу въезжаю в вопрос.
Однозначно нужно делать конструкторы с параметрами.
  

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


А нужны ли мы нам?

Сообщений: 692
Местоположение: Новосибирск
Зарегистрирован: 22. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #3 - 30. Мая 2006 :: 08:44
Печать  
А я в своё время вообще отказался от использования этого метода, потому как стоит лишь одно неверное телодвижение сделать, и систему валит вусмерь.
Ну его в баню. Агрегирование как-то надёжнее.
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #4 - 30. Мая 2006 :: 11:27
Печать  
sedmin писал(а) 30. Мая 2006 :: 03:52:
Вот этой фразы я не понял, хотя слова, вроде, все знаю. Даже ЗаменитьЭксзБазовогоКласса.  Улыбка

ок, рассказываю с кодом, на пальцах.

Итак, у нас есть два документа, и два класса, расширяющих функционал штатных 1С-вых документов.
Например "Документ.РКО" => "Документ_РКО" и "Документ.РКО_Вексельный" => "Документ_РКО_Вексельный".
Смотрим мы в модуль проведения каждого из этих документов и видим, что у нас имеется одинаковая последовательность методов:

Код
Выбрать все
_Сам = СоздатьОбъект("Документ_РКО");
_Сам.ЗаменитьЭксзБазовогоКласса("Документ.РКО", Контекст);
_Сам.__Инит__();
 



В _Сам.__Инит__() происходит расчет всяких разных нужных данных. Например бухитогов на позицию документа. Более того, метод __Инит__() для обоих классов одинаковый, и реализован в суперклассе "Документы_СБухИтогами".

Хочется и строчку _Сам.ЗаменитьЭксзБазовогоКласса("Документ.РКО", Контекст); засунуть в этот самый __Инит__(), с тем чтобы это выглядело примерно так:
Код
Выбрать все
_Сам = СоздатьОбъект("Документ_РКО");
_Сам.__Инит__(Контекст);
 



Так вот, когда вызов ЗаменитьЭксзБазовогоКласса() происходит в контексте базового класса - он пытается (мне так кажется) заменить экземпляр именно базового класса, а не того подчиненного, который на самом деле был создан функцией СоздатьОбъект().
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #5 - 30. Мая 2006 :: 11:28
Печать  
sedmin писал(а) 30. Мая 2006 :: 03:52:
А может это просто баг возник на одной из сборок?

Нет.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #6 - 30. Мая 2006 :: 11:48
Печать  
Еще поясни, плз.

1. Отношения между "Документ_РКО" и "Документы_СБухИтогами" какие?
Т.е. иерархию классов чуть подробнее надо бы. Или там чисто агрегирование?

2. __Инит__ где реализован (избыточный вопрос, конечно, если будет ответ на п.1.)?
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #7 - 30. Мая 2006 :: 11:58
Печать  
defcls.prm
Код
Выбрать все
класс Документы_СБухИтогами = __Документы_СБухИтогами@MD
{
    void __Инит__();
};

класс Документ_РКО = __Документ_РКО@MD : Документ.РКО, Документы_СБухИтогами
{};

класс Документ_РКО_Вексельный = __Документ_РКО_Вексельный@MD : Документ.РКО_Вексельный, Документы_СБухИтогами
{};
 



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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #8 - 30. Мая 2006 :: 12: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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #9 - 30. Мая 2006 :: 12:41
Печать  
kms писал(а) 30. Мая 2006 :: 12:36:
Т.е. он у тебя заменяет не Документ.РКО, а Документы_СБухИтогами?
Т.к. нет возможности явно указать, какой из базовых классов заменять?


Более точно было бы сказать эту фразу вот так:

Цитата:
Т.е. он у тебя заменяет не Документ_РКО, а Документы_СБухИтогами?
Т.к. нет возможности явно указать, какой из подчиненных классов заменять?

Тогда я отвечу "да". И добавлю, что заменять "какой-то из" классов иерархии в общем-то наверное и не нужно. Пожалуй всегда нужно заменять тот класс, что был изначально создан через СоздатьОбъект().

P.S. Все же утро вечера мудренее. Улыбка
P.P.S. Если у кого-то все же будут возражения к моим рассуждениям - с удовольствием выслушаю.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #10 - 30. Мая 2006 :: 12:42
Печать  
Сорри, лажу написал, поторопился.

Нет, видимо, он у тебя пытается заменить базовый класс "Документ.РКО" у экземпляра класса "Документы_СБухИтогами".
И обламывается, так?
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #11 - 30. Мая 2006 :: 12:50
Печать  
Цитата:
Пожалуй всегда нужно заменять тот класс, что был изначально создан через СоздатьОбъект().

P.P.S. Если у кого-то все же будут возражения к моим рассуждениям - с удовольствием выслушаю.


Не согласен.

Только к ООП это не имеет никакого отношения, тут у тебя все правильно.
ЗаменитьЭксзБазовогоКласса - это хак над ООП.

И либо мы позволяем замену базового класса, тогда это должно работать для любого места в иерархии.
Либо нет, тогда этот метод вообще вне закона.

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

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

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

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #12 - 30. Мая 2006 :: 12:53
Печать  
fez писал(а) 30. Мая 2006 :: 12:41:
P.S. Все же утро вечера мудренее. Улыбка

Сказал Федор и посмотрел на часы Смех
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #13 - 30. Мая 2006 :: 13:01
Печать  
kms писал(а) 30. Мая 2006 :: 12:50:
То что ты предлагаешь - это решение для чисто абстрактных классов, т.е. классов, которые никогда сами по себе не могут быть созданы.

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


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #14 - 30. Мая 2006 :: 13:04
Печать  
kms писал(а) 30. Мая 2006 :: 12:50:
Если же этот класс может быть создан, и он полагается на замену своего базового класса для себя, а потом ты создаешь наследника и код начинает работать по-другому, это полная лажа и источник очень хреновых проблем.

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

Эээ... постой-постой...

Цитата:
Пожалуй всегда нужно заменять тот класс, что был изначально создан через СоздатьОбъект().

Ну и где тут противоречие?
  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 2 3 ... 13
ОтправитьПечать