Переключение на Главную Страницу Страницы: 1 2 [3] 4 5 ... 13 ОтправитьПечать
Очень популярная тема (более 25 ответов) Полиморфизм ЗаменитьЭксзБазовогоКласса (число прочтений - 80455 )
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #30 - 30. Мая 2006 :: 15:09
Печать  
Ага, пример неудачный, все равно возьмется именно первый объект из иерархии, чей тип равен Док.РКО
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #31 - 30. Мая 2006 :: 15:11
Печать  
artbear писал(а) 30. Мая 2006 :: 15:09:
Ага, пример неудачный, все равно возьмется именно первый объект из иерархии, чей тип равен Док.РКО

Неправильно это!
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #32 - 30. Мая 2006 :: 15:12
Печать  
kms писал(а) 30. Мая 2006 :: 15:08:
Да какая разница.
Ну давай унаследуем Документы_СБухИтогами от Справочник.Товары.
Что изменится?

Еще хуже Улыбка
Есть разница - в этом случае класс Документы_СБухИтогами ни в коем случае не должен наследовать от Док.РКО, ведь в иерархии он не унаследован от такого класса !

Автор, пиши еще Улыбка
  

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


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #33 - 30. Мая 2006 :: 15:12
Печать  
kms писал(а) 30. Мая 2006 :: 15:08:
ЗаменитьЭкзБазовогоКласса внутри Документы_СБухИтогами должен работать с иерархией класса Документы_СБухИтогами и ни с какой другой!

Он не должен ничего знать про Документ_РКО и про Документ.РКО, или это уже не ООП.

Пойду подумаю над этим...
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #34 - 30. Мая 2006 :: 15:18
Печать  
artbear писал(а) 30. Мая 2006 :: 15:12:
Еще хуже Улыбка
Есть разница - в этом случае класс Документы_СБухИтогами ни в коем случае не должен наследовать от Док.РКО, ведь в иерархии он не унаследован от такого класса !

Это как?

Я и рисую другую иерархию, чтоб было понятно:
Код
Выбрать все
класс Документы_СБухИтогами = __Документы_СБИ@MD : Справочник.Товары
{};

Документы_СБухИтогами::Инит(__Конкретный_Товар)
{
ЗаменитьБазовыйОбъект("Справочник.Товары", __Конкретный_Товар);
}
 


Еще скажи, что документы от справочников не наследуют  Смех
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #35 - 30. Мая 2006 :: 15:20
Печать  
Это да, ничего криминального нету.
Ты дальше рисуй иерархию.
У тебя дальше что-то будет наследоваться?
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #36 - 30. Мая 2006 :: 15:21
Печать  
В примере с товаром, если принять предложение Федора,
Код
Выбрать все
СоздатьОбъект("Документы_СБухИтогами").Инит(Товар) будет работать,
 


а
Код
Выбрать все
СоздатьОбъект("Документ_РКО").Инит(Товар) не будет.
 


Ну разве это не хреново, други?
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #37 - 30. Мая 2006 :: 15:23
Печать  
artbear писал(а) 30. Мая 2006 :: 15:20:
Это да, ничего криминального нету.
Ты дальше рисуй иерархию.
У тебя дальше что-то будет наследоваться?

Иерархия крайне простая: Улыбка

Документы_СБухИтогами : Справочник.Товары
Документ_РКО : Документ.РКО, Документы_СБухИтогами.

Все законно?
  

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


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #38 - 30. Мая 2006 :: 15:24
Печать  
Брр, я почти запутался. Какое предложение Федора??
Вроде в последнем примере все правильно, все нормально наследуется и заменяется.
Юнит-тесты есть Улыбка
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #39 - 30. Мая 2006 :: 15:25
Печать  
Предложение Федора:
fez писал(а) 30. Мая 2006 :: 13:17:
kms писал(а) 30. Мая 2006 :: 13:13:
Теперь создаем класс Ц и ЗаменитьБазовыйОбъект() в классе Б начинает заменять экземпляр класса Б.

Проблема?


Угу. Проблема в том, что ты не читаешь того, что я пишу.

Цитата:
...тот класс, что был изначально создан через СоздатьОбъект().


10 минут медитаций.


10 минут что-то растянулись, вы не находите? Подмигивание
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #40 - 30. Мая 2006 :: 15:25
Печать  
Вот беру я мою иерархию. И в код класса Документы_СБухИтогами (который у меня сам по себе, и ни от кого не наследуется) вставляю вызов Сам(Контекст).Вид().
И не смотря на то, что класс Документы_СБухИтогами ничего не знает об иерархии класса Документ_РКО - этот вызов нормально отрабатывает и делает именно то, что мне нужно.

И называется это полиморфизм.

Почему же когда я хочу добиться подобного поведения не от метода Вид(), а от метода ЗаменитьЭксзБазовогоКласса() - это уже становится не ООП?

Пока я вижу в своем предложении единственную проблему, описанную в твоем примере. Но эта проблема появляется только в случае, когда у нас задвоены суперклассы в иерархии. Однако в данном случае мы в первую очередь сталкиваемся с отвратительным дизайном, что само по себе
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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #41 - 30. Мая 2006 :: 15:28
Печать  
kms писал(а) 30. Мая 2006 :: 15:21:
В примере с товаром, если принять предложение Федора,
Код
Выбрать все
СоздатьОбъект("Документы_СБухИтогами").Инит(Товар) будет работать,
 


а
Код
Выбрать все
СоздатьОбъект("Документ_РКО").Инит(Товар) не будет.
 




Почему не будет?
  
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #42 - 30. Мая 2006 :: 15:30
Печать  
Федор, еще раз поясни, что ты хочешь от ЗаменитьБазовыйОбъект? с учетом того, как счас мы построили иерархию
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #43 - 30. Мая 2006 :: 15:36
Печать  
fez писал(а) 30. Мая 2006 :: 15:28:
Почему не будет?

Если ЗаменитьБазовыйОбъект() будет работать для объекта класса, созданного функцией СоздатьОбъект(), то в данном случае он будет работать для класса "Документ_РКО", у которого среди базовых классов нет класса Справочник.Товары.
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #44 - 30. Мая 2006 :: 15:38
Печать  
artbear писал(а) 30. Мая 2006 :: 15:30:
Федор, еще раз поясни, что ты хочешь от ЗаменитьБазовыйОбъект? с учетом того, как счас мы построили иерархию


Еще раз от начала и до самого конца.

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

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



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

Итоговая иерархия вот такая:
defcls.prm
Код
Выбрать все
класс Документы_СБухИтогами = __Документы_СБухИтогами@MD
{
    void __Инит__();
};

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

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



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



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



Так вот, когда такое делаешь - реальной замены базового класса не происходит. То есть если в тот же самый __Инит__ следующими строчками вставить
Код
Выбрать все
Сообщить(""""+КонтекстДокумента.Фирма+"""");
Сообщить(""""+Сам(Контекст).Фирма+"""");
 


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