Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Полиморфизм ЗаменитьЭксзБазовогоКласса (число прочтений - 77183 )
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 записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

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

Проблема?


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

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


10 минут медитаций.
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

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

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


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

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

Это какой в твоей интерпретации?

В моем примере через СоздатьОбъект() могут быть созданы все классы: и А, и Б, и Ц.
Соответственно, метод должен заменять для класса Ц экземпляры классов А или Б, а для класса Б - экземпляр класса А.

Цитата:
Я понимаю когда класс "Б" меняет свой экземпляр на экземпляр класса "А". А зачем нуна так как ты сказал?


Этой фразой ты отправил меня в глубокую задумчивость. Често, не понимаю, как класс "Б" может менять свой экземпляр на экземпляр совсем другого класса "А". Это же нарушит всю иерархию.
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #19 - 30. Мая 2006 :: 13:50
Печать  
kms писал(а) 30. Мая 2006 :: 13:37:
Соответственно, метод должен заменять для класса Ц...

Метод должен заменять не для класса, а для объекта.

Цитата:
Цитата:
Я понимаю когда класс "Б" меняет свой экземпляр на экземпляр класса "А".


Этой фразой ты отправил меня в глубокую задумчивость. Често, не понимаю, как класс "Б" может менять свой экземпляр на экземпляр совсем другого класса "А". Это же нарушит всю иерархию.


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



Все правильно? Вопросов не возникает? Иерархия не нарушена?

Метод применяется к ОБЪЕКТУ. Конкретному объекту класса. Мы заменяем экземпляр данного конкретного объекта на экземпляр ДРУГОГО класса. И иерархии это не нарушает.

И я хочу, чтобы вне зависимости от того, где именно в иерархии располагается вызов метода ЗаменитьЭксзБазовогоКласса(), происходило именно это. Чтобы брался объект, созданный с помощью СоздатьОбъект() (а уж будет это "А", "Б" или "Ц" - нас не колышет), и именно этот объект подменялся на объект ДРУГОГО класса. Какого именно класса, и какой именно объект - будет указано в параметрах метода ЗаменитьЭксзБазовогоКласса().
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

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

У тебя возникли вопросы насчет моего мнения по этому вопросу? Нерешительный

Цитата:
Я понимаю когда класс "Б" меняет свой экземпляр на экземпляр класса "А".
...
Экземпляр_Б = СоздатьОбъект("Б");
Экземпляр_Б.ЗаменитьЭксзБазовогоКласса("А", ОбъектКласса_А);

Имхо у тебя проблема с терминологией или с пониманием процесса.
То, что ты написал в первом и втором случае - это разные вещи.
В коде приведен пример замены экземпляра класса А на экземпляр класса А.

А никак не так, как ты написал. Класс Б свой экземпляр на класс А не меняет и не может этого сделать!

Цитата:
Метод применяется к ОБЪЕКТУ. Конкретному объекту класса. Мы заменяем экземпляр данного конкретного объекта на экземпляр ДРУГОГО класса. И иерархии это не нарушает.

Все же дело в отсутствии понимания, но при этом ты еще и кипятишься. Печаль
Мы заменяем экземпляр конкретного объекта на экземпляр ТОГО ЖЕ класса. Пойми, пожалуйста, никак не другого класса!

По последнему пункту сейчас еще раз напишу подробно.
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #21 - 30. Мая 2006 :: 14:04
Печать  
kms писал(а) 30. Мая 2006 :: 14:02:
По последнему пункту сейчас еще раз напишу подробно.

Не надо, я понял.
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

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

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


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


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

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

Метод нужный и верный, пока у нас не будет конструкторов с параметрами.

Я этот метод использую в универсальных классах Справочников, Документов, когда класс определен как потомок класса Справочник, а инициализируется как объект конкретного справочника.

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

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #24 - 30. Мая 2006 :: 14:30
Печать  
artbear писал(а) 30. Мая 2006 :: 14:23:
Прочитал все, что вы написали - ничего не понял Улыбка
[...]
Я этот метод использую в универсальных классах Справочников, Документов, когда класс определен как потомок класса Справочник, а инициализируется как объект конкретного справочника.

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #25 - 30. Мая 2006 :: 14:44
Печать  
fez писал(а) 30. Мая 2006 :: 14:20:
Цитата:
То что ты предлагаешь - это решение для чисто абстрактных классов, т.е. классов, которые никогда сами по себе не могут быть созданы.

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


Приведи пример.


ОК. На примере твоей иерархии, только Документы_СБухИтогами я тоже унаследую от Документ.РКО (для примера, это просто абстракция)
Код
Выбрать все
класс Документ_РКО = __Документ_РКО@MD : Документ.РКО,  Документы_СБухИтогами
{};

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



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

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



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

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



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

Ты предлагаешь заменять базовый объект класса "Документ_РКО".

Здесь 2 проблемы:
1. Код класса Документы_СБухИтогами начинает работать по-другому, это то, о чем я писал в самом начале. Это источник ошибок.
2. В принципе, Документы_СБухИтогами ничего не обязан знать о каких-то там наследниках. Это принципиально.
  

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


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

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

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

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

Плохая абстракция. Зачем нам классу Документ_РКО два суперкласса Документ.РКО? Почему в таком случае нельзя наследовать Документ_РКО только от Документы_СБухИтогами?

Пока примера не понял, давай другой.

(бурчит под нос) Давайте теперь еще зациклим иерархию классов...
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #28 - 30. Мая 2006 :: 15:08
Печать  
kms писал(а) 30. Мая 2006 :: 14:53:
А по другому в существующей архитектуре, видимо, и не сделать.

Ну почему же? Можно еще вслед за Лешей Дирксом использовать агрегирование.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #29 - 30. Мая 2006 :: 15:08
Печать  
Цитата:
Плохая абстракция. Зачем нам классу Документ_РКО два суперкласса Документ.РКО? Почему в таком случае нельзя наследовать Документ_РКО только от Документы_СБухИтогами?


Да какая разница.
Ну давай унаследуем Документы_СБухИтогами от Справочник.Товары.
Что изменится?

ЗаменитьЭкзБазовогоКласса внутри Документы_СБухИтогами должен работать с иерархией класса Документы_СБухИтогами и ни с какой другой!

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

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


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #45 - 30. Мая 2006 :: 15:39
Печать  
kms писал(а) 30. Мая 2006 :: 15:36:
fez писал(а) 30. Мая 2006 :: 15:28:
Почему не будет?

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

Как это? Вассал моего вассала - не мой вассал? Что же это за ООП?
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #46 - 30. Мая 2006 :: 15:39
Печать  
fez писал(а) 30. Мая 2006 :: 15:25:
Вот беру я мою иерархию. И в код класса Документы_СБухИтогами (который у меня сам по себе, и ни от кого не наследуется) вставляю вызов Сам(Контекст).Вид().
...
И называется это полиморфизм.

То, что оно работает, не значит, что это правильно.
Если ты создашь просто класс Документы_СБухИтогами и вызовешь Сам(Контекст).Вид(), что будет?
  

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


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

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

Почему это нет среди базовых классов? у предка/папы есть свой папа/предок (дедушка) Спр.Товары и все нормально заменяется, в связи с иерархией.
Иерархия - это же не один уровень, а несколько Улыбка
  

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

То, что оно работает, не значит, что это правильно.
Если ты создашь просто класс Документы_СБухИтогами и вызовешь Сам(Контекст).Вид(), что будет?

Это зависит от того, реализован ли у меня метод Вид() в самом классе или выше по иерархии.
Если не реализован - я сам себе злобный баклан.
Но метод ЗаменитьЭксзБазовогоКласса у меня определен для всех КОП, так что тут проблем я не вижу.
  
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #49 - 30. Мая 2006 :: 15:43
Печать  
Суперкласс "Документы_СБухИтогами"
Это как?
Как построена иерархия с его участием?
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #50 - 30. Мая 2006 :: 15:44
Печать  
fez писал(а) 30. Мая 2006 :: 15:39:
kms писал(а) 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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #51 - 30. Мая 2006 :: 15:46
Печать  
artbear писал(а) 30. Мая 2006 :: 15:43:
Суперкласс "Документы_СБухИтогами"
Это как?
Как построена иерархия с его участием?

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #52 - 30. Мая 2006 :: 15:47
Печать  
fez писал(а) 30. Мая 2006 :: 15:42:
Это зависит от того, реализован ли у меня метод Вид() в самом классе или выше по иерархии.
Если не реализован - я сам себе злобный баклан.
Но метод ЗаменитьЭксзБазовогоКласса у меня определен для всех КОП, так что тут проблем я не вижу.

ОК, я чуть про другое. У тебя в Документы_СБухИтогами как реализован Вид()?
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #53 - 30. Мая 2006 :: 15:50
Печать  
kms писал(а) 30. Мая 2006 :: 15:47:
fez писал(а) 30. Мая 2006 :: 15:42:
Это зависит от того, реализован ли у меня метод Вид() в самом классе или выше по иерархии.
Если не реализован - я сам себе злобный баклан.
Но метод ЗаменитьЭксзБазовогоКласса у меня определен для всех КОП, так что тут проблем я не вижу.

ОК, я чуть про другое. У тебя в Документы_СБухИтогами как реализован Вид()?


у меня - никак. но просто потому, что я не создаю объектов типа Документы_СБухИтогами. Если бы создавал - тогда я бы знал, какое поведение я хочу увидеть от этого метода.
  
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

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

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

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #56 - 30. Мая 2006 :: 15:52
Печать  
fez

Цитата:
Сам(Контекст).ЗаменитьЭксзБазовогоКласса("Документ."+КонтекстДокумента.Вид(), КонтекстДокумента)


Нет, еще раз. Не правильно в классе Документы_СБухИтогами пытаться менять иерархию класса Документ_РКО, вызывая метод у объекта Сам(Контекст).

Правильно будет передать кроме КонтекстДокумента еще и объект _Сам типа Документ_РКО и уже у него вызывать ЗаменитьЭксзБазовогоКласса.

Понимаешь?

Изменено:
Вот так:

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

Цитата:
__Документ.ЗаменитьЭксзБазовогоКласса("Документ."+КонтекстДокумента.Вид(), КонтекстДокумента)


  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #57 - 30. Мая 2006 :: 15:55
Печать  
kms писал(а) 30. Мая 2006 :: 15:52:
fez

Цитата:
Сам(Контекст).ЗаменитьЭксзБазовогоКласса("Документ."+КонтекстДокумента.Вид(), КонтекстДокумента)


Нет, еще раз. Не правильно в классе Документы_СБухИтогами пытаться менять иерархию класса Документ_РКО, вызывая метод у объекта Сам(Контекст).

Правильно будет передать кроме КонтекстДокумента еще и объект _Сам типа Документ_РКО и уже у него вызывать ЗаменитьЭксзБазовогоКласса.

Понимаешь?


Нет, не понимаю.
Почему для вызова метода Вид() класса Документ.РКО мне не нужно передавать объект _Сам? Почему для Вид() я могу обойтись работой через Сам(Контекст) ?

P.S. Ну то есть я понимаю, что твой вариант скорее всего заработает. Но почему мой вариант неправильный с точки зрения ООП?
  
Наверх
www  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

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


Да, имхо также лучше явно задавать подобное поведение.

Иначе при другом, неявном преобразовании, можно глюков получить.
ЗЫ явно/неявно - перекликается с полемикой по ПолучитьКонтекстОкружения Улыбка
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #59 - 30. Мая 2006 :: 15:57
Печать  
artbear писал(а) 30. Мая 2006 :: 15:56:
Иначе при другом, неявном преобразовании, можно глюков получить.

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #60 - 30. Мая 2006 :: 15:59
Печать  
Цитата:
И то, что у тебя работает Вид() без явного задания в классе - это не полиморфизм, а баг в чистом виде.

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

Блин, народ, мне надо свалить с работы. Через полчаса буду дома - все прочитаю. Улыбка
  

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


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

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

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #62 - 30. Мая 2006 :: 16:07
Печать  
kms писал(а) 30. Мая 2006 :: 15:59:
И то, что у тебя работает Вид() без явного задания в классе - это не полиморфизм, а баг в чистом виде.


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

Повторюсь. ЗаменитьЭксзБазовогоКласса() определен для всех КОП.
Так что отсылки на то, что у кого-то не определен какой-то метод - не принимаются.

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


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #63 - 30. Мая 2006 :: 16:08
Печать  
artbear писал(а) 30. Мая 2006 :: 16:06:
Да, пока у нас нет виртуальных функций, подобное поведение можно считать ошибочным.

У нас все функции - виртуальные.
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #64 - 30. Мая 2006 :: 16:12
Печать  
Я устал. Ошибка/не ошибка, вирутальные/не виртуальные, ООП/не ООП...

Я привел пример, когда полиморфизм ЗаменитьЭксзБазовогоКласса() нужен и полезен.
Приведите мне пример, когда полиморфизм ЗаменитьЭксзБазовогоКласса() вреден и провоцирует на ошибки.

Все, без примера дальше говорить не буду. Со сжатыми губами
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #65 - 30. Мая 2006 :: 16:17
Печать  
Обновил пример, описывающий проблему. Вид() будет работать всегда и везде, это я ступил. Заменил вызов Вид() на обращение к реквизиту Фирма.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #66 - 30. Мая 2006 :: 16:36
Печать  
Собственно, давай поставим цель.
Метод решения (заметь, полностью корректный) у тебя есть, надо только проверить его.
Дальше у нас какой вопрос - практический или теоретический?
Если практический - то чего мы хотим в итоге?
Если теоретический - то почему  Со сжатыми губами?

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

Хинт: попробуй сделать то, что ты делаешь в 1С на C++.
Только без деклараторов типа friend.
  

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


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

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

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #68 - 30. Мая 2006 :: 16:43
Печать  
kms писал(а) 30. Мая 2006 :: 16:36:
у нас какой вопрос - практический или теоретический?
Если практический - то чего мы хотим в итоге?
Если теоретический - то почему  Со сжатыми губами?

Вопрос и практический и теоретический одновременно.
Практически - я хочу, чтобы работало так, как мне хочется. Без лишнего параметра.
Теоретически - если меня убедят, что это может привести к проблемам - я соглашусь на твой способ решения.
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #69 - 30. Мая 2006 :: 16:49
Печать  
kms писал(а) 30. Мая 2006 :: 16:36:
Хинт: попробуй сделать то, что ты делаешь в 1С на C++.
Только без деклараторов типа friend.

На C++ не умею, я вот на питоне написал.

Код
Выбрать все
class Base:
	def PolimorphMethod(self):
		self.MethodFromTheChild()

class Child_One(Base):
	def MethodFromTheChild(self):
		print "child one"

class Child_Two(Base):
	def MethodFromTheChild(self):
		print "child two"


One = Child_One()
One.PolimorphMethod()

Two = Child_Two()
Two.PolimorphMethod()
 



печатает

Цитата:
M:\fedor config\temp>test.py
child one
child two
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #70 - 30. Мая 2006 :: 16:49
Печать  
Этта. Я тоже чуток подустал. Ну как еще тебе доказать. Пойду, что ли полистаю Гради Буча.
Но серьезно, ты попробуй на C++ твои конструкции схематично реализовать - не получится.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #71 - 30. Мая 2006 :: 16:51
Печать  
Цитата:
На C++ не умею, я вот на питоне написал.

ОК, щас сам напишу.
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #72 - 30. Мая 2006 :: 16:53
Печать  
Кусочек доки для питона:
Цитата:
(For C++ programmers: all methods in Python are effectively virtual.)
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #73 - 30. Мая 2006 :: 16:55
Печать  
kms писал(а) 30. Мая 2006 :: 16:49:
Но серьезно, ты попробуй на C++ твои конструкции схематично реализовать - не получится.

А что, у нас С++ - это эталон ООП?

Цитата:
Пойду, что ли полистаю Гради Буча.

Давно пора. Ты еще вчера говорил, что ты "не в теме".
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #74 - 30. Мая 2006 :: 16:58
Печать  
fez писал(а) 30. Мая 2006 :: 16:55:
Ты еще вчера говорил, что ты "не в теме".

Вчера я просто уже бутыль мартини выпил, как ты нарисовался.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #75 - 30. Мая 2006 :: 17:25
Печать  
Вот код на С++:
Цитата:
class base
{
public:
     virtual void meth() = 0 {};
     void test() {meth();};
};

class child : public base
{
public:
     virtual void meth() {Msg("child");}
};

funcTest()
{
  child c;
  c.meth();
  c.test();
}

Печатает, понятное дело, "child", "child".

Всего лишь одно отличие:
Метод meth() чисто виртуальный. А класс base - чисто абстрактный класс.
Соответственно, контроль ошибок - реальный, а не призрачный.

С++ эталон? Не знаю. Но то, что ты написал на питоне - это ужасно.
Впрочем, если тебе не важна правда и ты хочешь остаться при своих - пожалуйста. Нерешительный

P.S.
Код, который ты продемонстрировал - крайне небезопасный. Более того, в 1С ты это можешь отследить исключительно на этапе выполнения.
Я такой код не поддерживаю и поддерживать кого-либо (даже тебя!) в его использовании не собираюсь.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #76 - 30. Мая 2006 :: 17:47
Печать  
Если это тебя не убеждает, вот примеры ошибок на этапе компиляции:

Попытка создания класса base:
Код
Выбрать все
base b;

error C2259: 'base' : cannot instantiate abstract class due to following members:
warning C4259: 'void __thiscall base::meth(void)' : pure virtual function was not defined
 



Попытка создания класса, не определяющего чисто виртуальные функции:
Код
Выбрать все
class child2 : public base
{
public:
	void ch2() {Msg("ch2");};
	   // метод meth() не определен
};
child2 c2;

error C2259: 'child2' : cannot instantiate abstract class due to following members:
warning C4259: 'void __thiscall base::meth(void)' : pure virtual function was not defined
 


Как ты такой контроль реализуешь в 1С/1CPP ты подумал?
Почувствуйте разницу, блин.

Федор, что-то ты перевел меня в состояние повышенной боевой готовности.
Если бы ты был не Федором Езеевым и практически боевым товарищем, а, скажем, кирюхой с итланда, я бы на тебя щас конкретно наехал. Класс
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #77 - 30. Мая 2006 :: 18:59
Печать  
И, напоследок, загляни вот сюда: http://skipy.dev.juga.ru/philosophy/inheritance.html
Не ты ли эту ссылку давал? Или это Палыч был?

Отлично написано, лучше не скажешь.
Прочитай про наследование реализации и наследование интерфейсов, как это сделано в java (в С++ так же).
Если ты поймешь, почему так сделано, у тебя не останется вопросов в отношении того, как должна работать замена базовых объектов в 1cpp.
И почему метод (Проведен()?) или свойство (Фирма?) наследника, которые видны в базовом классе без явного определения интерфейса - это плохо.

Очень, очень плохо. Злой

P.S.
И твоя ошибка в том, что ты путаешь наследование реализации (а в 1С/1cpp это именно так) с наследованием интерфейсов.
При этом не имея никакого желания интерфейс этот определять и забивая болт на понятие инкапсуляции вообще. Печаль
  

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


1С++ любитель

Сообщений: 447
Местоположение: г. Новосибирск
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #78 - 31. Мая 2006 :: 03:26
Печать  
Ну... Вы, блин, даете...  Ужас
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #79 - 31. Мая 2006 :: 06:41
Печать  
DrACe писал(а) 31. Мая 2006 :: 03:26:
Ну... Вы, блин, даете...  Ужас

Да уж. Тема вызвала прилив сил Улыбка
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #80 - 31. Мая 2006 :: 06:58
Печать  
Федор
Поскольку реально меня вопрос заинтересовал, я вчера и правда взялся за Буча, Страуструпа и даже Айру Пол посмотрел.
И знаешь, я придумал, как сформулировать вопрос, чтобы он был простым и очевидным.

Вот смотри: у тебя граф иерархии:
Код
Выбрать все
Документ.РКО <-- Документ_РКО --> Документы_СБИ
 



Если полиморфизм и его реализация в отношении суперкласса/подклассов действительно может оказаться серьезным поводом для споров (вспомни наше вчерашнее непонимание), поскольку он может иметь различные формы, причем как эффективные (механизм виртуальных функций), так и неэффективные (например, сплошь и рядом в 1С через проверку типов), то отношения между различными суперклассами предельно просты.

Если помнишь, началось все вот с этого:
Цитата:
Вот беру я мою иерархию. И в код класса Документы_СБухИтогами (который у меня сам по себе, и ни от кого не наследуется) вставляю вызов Сам(Контекст).Вид().
И не смотря на то, что класс Документы_СБухИтогами ничего не знает об иерархии класса Документ_РКО - этот вызов нормально отрабатывает и делает именно то, что мне нужно.

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

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

Потом было это:
Цитата:
Так вот, когда такое делаешь - реальной замены базового класса не происходит. То есть если в тот же самый __Инит__ следующими строчками вставить

Сообщить(""""+КонтекстДокумента.Фирма+"""");
Сообщить(""""+Сам(Контекст).Фирма+"""");

то будет написано

"ООО Альтерпласт"
""

Вот здесь давай попробуем ответить себе, что ты пытаешься сделать.
Ты пытаешься обратиться в одном базовом классе к методам и свойствам другого базового класса.
Ты это называешь полиморфизмом.
Если ты отстаивиешь свою точку зрения, обоснуй, на каких коцепциях ООП ты основываешь свое утверждение.
Утверждение, что обращение из одного суперкласса к методам и членам другого суперкласса законно и является полиморфизмом.
Я бы хотел увидеть ссылку на авторитетный первоисточник, твоего мнения здесь недостаточно.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #81 - 31. Мая 2006 :: 07:12
Печать  
В отношении ЗаменитьЭксзБазовогоКласса().

Это не виртуальная функция. Да, она определена для каждого класса.
Но это не виртуальная функция. Это, если хочешь, служебная функция.
Она нужна исключительно для конструирования иерархии в 1С.

Ее поведение должно быть детерминировано и здесь я против какого бы то ни было полиморфизма.

Я уже объяснял почему.
Если ты переопределил любую функцию в подклассе, проблемы не будет.
Ну возвращал у тебя Вид() "Круг", стал возвращать "Квадрат" какие проблемы?
"Переопределение" же ЗаменитьЗксзБазовогоКласса в корне изменит поведение суперкласса, если тот полагается на определенную работу ЗаменитьЭксзБазовогоКласса().

И я понимаю твое желание ее переопределить, поскольку фактически у тебя класс является чисто абстрактным (просто ты не сразу в этом признался).
Для чисто абстрактного класса переопределить ЗаменитьЭксзБазовогоКласса() было бы возможно.
Одна проблема: у нас нет поддержки абстрактных классов в 1С/1CPP.
Значит, обязательно найдется кто-то, кто возьмет твою иерархию, не разобравшись, где классы абстрактные, где нет, инстанциирует объекты абстрактных классов и получит труднонаходимые, но конкретные грабли.

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

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

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


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

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

Цитата:
Вкратце:
1. Считаю возможным перегрузку ЗаменитьБазовыйОбъект() только для абстрактных (интерфейсных) классов.
Для этого их и нужно сперва создать в 1cpp.

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

3. Считаю невозможным и некорректным использование свойств подкласса в суперклассе.

4. Считаю некорректным использование методов подкласса в суперклассе без предварительного объявления интерфейса (т.е. по сути без определения виртуальных функций в базовом классе).
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #83 - 31. Мая 2006 :: 11:32
Печать  
kms писал(а) 31. Мая 2006 :: 09:43:
Вынесу-ка я сюда резюме. Вдруг кто-то присоединится к нашей дискуссии.


Вы были правы, доктор. Признаю себя ослом и жду дальнейших распоряжений. (с) мультик "Остров сокровищ".
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #84 - 31. Мая 2006 :: 12:33
Печать  
Блин, как красиво ты закрыл тему! Выражаю свое восхищение. Улыбка
Продолжаем поиск сокровищ. Подмигивание
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #85 - 31. Мая 2006 :: 14:17
Печать  
В целом я согласен с вынесенным вердиктом.

Но все же остается пара моментов:

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

2. Относительно виртуальных методов. Надо признать, что в скриптовых языках, таких, например, как Питон, все методы являются виртуальными. Это только с строгих языках, таких как С++ и Ява введены механизмы, которые позволят отслеживать подобные вещи. Язык 1С и 1С++ (не надо лукавить) надо отнести к нестрогим скриптовым языкам.
И надо оставить в отношении виртуальных методов все как есть, и не считать их появление и использование багом.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #86 - 31. Мая 2006 :: 14:24
Печать  
sedmin писал(а) 31. Мая 2006 :: 14:17:
1. Что будет возвращать ТипЗначенияСтр(Сам(Контекст)), если ее написать в модуле Документы_СБухИтогами?

Ну тут все просто, будет результат "Документы_СБухИтогами"

Сам в себе усомнился, проверил, убедился, что неправ.
Вернется именно тип значения реального объекта, т.е. имя класса реального объекта, т.е. "Документ_РКО"
ЗЫ юнит-тесты как обычно помогли
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #87 - 31. Мая 2006 :: 14:45
Печать  
В чем тогда разница в результате вызова Сам(Контекст) в модулях Документы_СБухИтогами и Документ_РКО?
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #88 - 31. Мая 2006 :: 14:59
Печать  
sedmin писал(а) 31. Мая 2006 :: 14:45:
В чем тогда разница в результате вызова Сам(Контекст) в модулях Документы_СБухИтогами и Документ_РКО?


ВОТ !!! ВОТ !!! Именно это я и пытался выяснить... А в ответ был обкидан какаш анреспектами.

То есть на вопрос: почему у нас все методы у класса виртуальны, а ЗаменитьЭксзБазовогоКласса - нет, я в ответ получил "а нечего пользоваться виртуальностью методов - это моветон".
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #89 - 31. Мая 2006 :: 14:59
Печать  
sedmin
Тут у меня мнение совпадает с мнением Артура (зачеркнутым).

Здесь, правда, возможны варианты.
Если рассматривать концепцию абстрактных классов, то я не против рассмотрения ТипЗначенияСтр() и ЗаменитьБазовыйОбъект() как чисто виртуальных и, соответственно, возможности их переопределения.

Для классов, которые могут быть инстанциированы (а у нас сейчас все такие), служебные функции не должны иметь возможность переопределения, потому что это приведет к различному поведению суперкласса в случае, когда он создан сам по себе и когда он создан в составе иерархии.

Здесь надо продумать реализацию RTTI, возможно как раз ТипЗначенияСтр() мы и будем использовать как основу RTTI - тогда это также особый случай, который никак не влияет на наше решение по остальным служебным функциям.

Цитата:
2. Относительно виртуальных методов. Надо признать, что в скриптовых языках, таких, например, как Питон, все методы являются виртуальными. Это только с строгих языках, таких как С++ и Ява введены механизмы, которые позволят отслеживать подобные вещи. Язык 1С и 1С++ (не надо лукавить) надо отнести к нестрогим скриптовым языкам.  
И надо оставить в отношении виртуальных методов все как есть, и не считать их появление и использование багом.

До появления 1CPP 1С был чисто объектным и братья Нуралиевы на семинарах задавали сакраментальные вопросы типа "ну, давайте, расскажите нам, что такое ООП и зачем оно вам нужно".
Сейчас мы имеем первичную реализации логики ООП, которая имеет определенные нарушения принципов ООП.
Другое дело, что мы привыкли к этой логике и готовы ее защищать. Потому что это удобно.
В этом есть здравый смысл. Вообще, по концепции ООП и эффективности ее конкретной реализации можно ведь говорить долго.
Меня, если честно, до сих пор поражает список литературы, приведенный Бучем в его книге. Там примерно 50 листов.

Однако дело не в механизмах, которые введены в С++ (С++, кстати, гибок именно за счет позднего связывания), а в нашем решении.
Мы можем сделать проще (хоть вообще все классы в один контекст объединим с произвольным доступом к методам и свойствам).
Мы можем приблизиться к классической схеме ООП и механизмы контроля мы можем обеспечить не хуже, чем в С++.
Правда, только на этапе выполнения.

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

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #90 - 31. Мая 2006 :: 15:03
Печать  
kms писал(а) 31. Мая 2006 :: 14:59:
Цель (для меня) в конечном итоге - обеспечение удобной разработки в небольших проектах и безопасного кода в крупных.

Подписываюсь под целью.
Только добавлю, что в крупных проектах удобство разработки так же немаловажно.
А еще от себя добавлю, что безопасность кода в крупном проекте лучше всего обеспечивают юниттесты.
  
Наверх
www  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #91 - 31. Мая 2006 :: 15:13
Печать  
kms
Во завернул.
Вроде и ничего против не сказал. Но даже как-то неудобно стало. Улыбка
Буду изучать твою писанину.
  
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #92 - 31. Мая 2006 :: 15:16
Печать  
А может быть вы ответите? Вопрос то был прямой, а не риторический.

sedmin писал(а) 31. Мая 2006 :: 14:45:
В чем разница в результате вызова Сам(Контекст) в модулях Документы_СБухИтогами и Документ_РКО?

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #93 - 31. Мая 2006 :: 15:21
Печать  
kms писал(а) 31. Мая 2006 :: 14:59:
Мы можем приблизиться к классической схеме ООП и механизмы контроля мы можем обеспечить не хуже, чем в С++.
Правда, только на этапе выполнения.

Почему только на этапе выполнения? Из общения с разработчиками 1С++ я понял, что вполне реально сделать всякие вкусности на этапе компиляции.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #94 - 31. Мая 2006 :: 15:23
Печать  
Дайте подумать.

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

Думаю, все же это все нормально будет вписываться в концепцию ООП.
Только меня сейчас очень сильно дергают, видимо вечером уже дома отвечу.

Не волнуйтесь, мы все сделаем красиво. Улыбка
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #95 - 31. Мая 2006 :: 15:24
Печать  
sedmin писал(а) 31. Мая 2006 :: 15:21:
kms писал(а) 31. Мая 2006 :: 14:59:
Мы можем приблизиться к классической схеме ООП и механизмы контроля мы можем обеспечить не хуже, чем в С++.
Правда, только на этапе выполнения.

Почему только на этапе выполнения? Из общения с разработчиками 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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #96 - 31. Мая 2006 :: 15:27
Печать  
kms писал(а) 31. Мая 2006 :: 15:23:
Дайте подумать.

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

Думаю, все же это все нормально будет вписываться в концепцию ООП.

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

Такой изврат получился, что просто ой.
  
Наверх
www  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #97 - 31. Мая 2006 :: 15:47
Печать  
kms писал(а) 31. Мая 2006 :: 15:24:
sedmin писал(а) 31. Мая 2006 :: 15:21:
Почему только на этапе выполнения? Из общения с разработчиками 1С++ я понял, что вполне реально сделать всякие вкусности на этапе компиляции.

Вот это не представляю себе, как. Делись.


Ничего хитрого тут нет. Сейчас же код 1С++ все равно отдельно от кода 1С компилируется. Так что навернуть там можно что угодно.

Надо только, чтобы VisualС++ в конфигураторе тот же синтаксис мог поддерживать. Сейчас это делается наилучшим из методов -  copy/paste. Но, я думаю, V1C++ мог бы и пользоваться услугами 1С++.
Представляете: V1C++ создает объект Addin.1C++ и вперед... на мины...
  
Наверх
 
IP записан
 
Палыч
1c++ power user
Отсутствует


I Love 1Cv8!

Сообщений: 217
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #98 - 31. Мая 2006 :: 17:34
Печать  
Мда... монументальная ветка Подмигивание

Из всего сказанного я так и не уловил предпосылок к использованию наследования. Недоумеваю, почему большинство одинэсников считают применение наследования чем-то само-собой разумеющимся, а применение агрегирования - требующим веского обоснования? Подмигивание 

Точнее, даже, так: я на 100% уверен, что наследование, в данном абстрактном случае, не понадобится. Почему? Ну... это длинная история. И совсем не интересная Подмигивание А интереснее было бы обсудить решение конкретной задачи (не забываем, что в семерке документ и его форма - не совсем одно и то-же).
  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #99 - 31. Мая 2006 :: 17:47
Печать  
Цитата:
Такой изврат получился, что просто ой.

Забавно, а я как раз твою концепцию обдумываю. Улыбка

Палыч
Я рад. что ты с нами.
Видишь ли, как раз на конкретику-то и не тянет, хотя мы с нее начали Улыбка

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

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

Ой, чую я, щас понесется по новой. Смех
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #100 - 31. Мая 2006 :: 18:15
Печать  
sedmin писал(а) 31. Мая 2006 :: 15:47:
Ничего хитрого тут нет. Сейчас же код 1С++ все равно отдельно от кода 1С компилируется. Так что навернуть там можно что угодно.

Надо только, чтобы VisualС++ в конфигураторе тот же синтаксис мог поддерживать. Сейчас это делается наилучшим из методов -  copy/paste. Но, я думаю, V1C++ мог бы и пользоваться услугами 1С++.
Представляете: V1C++ создает объект Addin.1C++ и вперед... на мины...


Понимаешь, я в этом предложении для себя вижу как минимум 1 юр. и 1 техническую проблему.
Ну и фактор времени, конечно.

В этом плане дополнить реализацию классов 1cpp концепциями абстрактных классов и чисто виртуальных функций, а также обеспечить нормальный уровень изоляции классов с контролем всего этого в момент инстанциирования объекта мне представляется на порядки более выполнимой задачей.
Т.е. именно так: реально выполнимой задачей.

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

Цитата:
Буду изучать твою писанину.
...
А может быть вы ответите? Вопрос то был прямой, а не риторический.

Ну вот, блин, прочитал и перешел на вы. Не надо, давай будем без галстуков Улыбка
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #101 - 31. Мая 2006 :: 18:24
Печать  
fez писал(а) 31. Мая 2006 :: 15:27:
Такой изврат получился, что просто ой.


Кстати, поделись с народом-то.
У тебя там ромбовидная иерархия получилась или еще что? Эту проблему надо обдумать.
Интересно, как у нас сейчас это решено?
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #102 - 31. Мая 2006 :: 18:30
Печать  
kms писал(а) 31. Мая 2006 :: 18:15:
[Цитата:
Буду изучать твою писанину.
...
А может быть вы ответите? Вопрос то был прямой, а не риторический.

Ну вот, блин, прочитал и перешел на вы. Не надо, давай будем без галстуков Улыбка


Ну я же написал "вы" а не "Вы". Или ты тут один против всех?  Подмигивание

Ну вот. Снова ушел от ответа.   Печаль
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #103 - 31. Мая 2006 :: 18:41
Печать  
Не, я не против, я за. Подмигивание

Подожди чуть.
По тому вопросу, который ты поднял (о наследовании служебных. функций) будет решение.
Мне нужно сейчас полностью изучить детали реализации всего этого в 1cpp.
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #104 - 31. Мая 2006 :: 18:48
Печать  
При чем здесь наследование служебных функций? Вопрос звучит так:

Чем отличается результат вызова Сам(Контекст) при вызове из модуля родителя и из модуля наследника?

Это же ссылка на один и тот же объект. Или не так?
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #105 - 31. Мая 2006 :: 19:05
Печать  
kms писал(а) 31. Мая 2006 :: 17:47:
Что касается наследования и агрегации, то как я понимаю, основываясь на концепциях, изложенных Бучем, наследование - это отношение общего и частного, а агрегация - отношение целого и части.

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

Теоретически можно класс "Документы_СБИ" переписать на класс "БухИтогиВМодулеДокумента", и тогда агрегирование будет вполне так себе оправдано.

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #106 - 31. Мая 2006 :: 19:06
Печать  
sedmin
Я ж тебе сказал, что детали реализации мне нужно смотреть.
Если тебе ответ нужен сейчас - это действительно не ко мне вопрос, а к Deb'у.

Что касается вопроса как оно должно быть - то я ответил раньше.
Через Сам(Контекст) суперкласса не должно быть возможности обратиться к методам и свойствам других суперклассов (по отношению к общему подклассу), к невиртуальным методам и свойствам подкласса.

В отношении виртуальных функций разницы быть не должно.
В этом плане остается открытым вопрос по служебным функциям, именно он меня сейчас и занимает.
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #107 - 31. Мая 2006 :: 19:09
Печать  
sedmin писал(а) 31. Мая 2006 :: 18:48:
При чем здесь наследование служебных функций? Вопрос звучит так:

Чем отличается результат вызова Сам(Контекст) при вызове из модуля родителя и из модуля наследника?

Это же ссылка на один и тот же объект. Или не так?


ВОТ !!! Прислушайтесь к нему. Это же ключевой момент.

Повсюду в 1С++ Сам(Контекст) - это ссылка на один и тот же обект. Тот самый, что был создан с помощью СоздатьОбъект(). За одним, нафиг, исключением: когда мы вызываем ЗаменитьЭксзБазовогоКласса(). Вопрос: ПОЧЕМУ?

И второй вопрос: кому повредит, если это поведение изменить? Кому станет лучше я уже знаю.
  
Наверх
www  
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #108 - 31. Мая 2006 :: 19:14
Печать  
Палыч писал(а) 31. Мая 2006 :: 17:34:
Точнее, даже, так: я на 100% уверен, что наследование, в данном абстрактном случае, не понадобится. Почему? Ну... это длинная история. И совсем не интересная Подмигивание

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #109 - 31. Мая 2006 :: 19:19
Печать  
Цитата:
Повсюду в 1С++ Сам(Контекст) - это ссылка на один и тот же обект. Тот самый, что был создан с помощью СоздатьОбъект(). За одним, нафиг, исключением: когда мы вызываем ЗаменитьЭксзБазовогоКласса(). Вопрос: ПОЧЕМУ?

Не, Федор, ну разные это вопросы.

1. Что делать с ЗаменитьБазовыйОБъект()
2. Нормальная изоляция классов.

Понимешь?
Мы можем решить (и, скорее всего, решим) вопрос 1 так, как ты предлагаешь.
Т.е. организуем виртуализацию этого метода.

Но при этом все равно останемся заложниками реализации Deb'a.
Удобной, привычной, но опасной реализации.

Насколько я сейчас представляю, Deb просто конструирует общий класс путем сливания в него всех подкласса и всех суперклассов с каким-то разрешением конфликтов (Артур сказал, что берется первый попавшийся метод с совпадающим именем).
Поэтому контекст один, и обращаться ты можешь куда хочешь и сколько хочешь.
Это не ООП, но это концепция классов Deb'a. И мы ее любим. Но любит ли она нас?
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #110 - 31. Мая 2006 :: 19:21
Печать  
fez писал(а) 31. Мая 2006 :: 19:14:
Палыч писал(а) 31. Мая 2006 :: 17:34:
Точнее, даже, так: я на 100% уверен, что наследование, в данном абстрактном случае, не понадобится. Почему? Ну... это длинная история. И совсем не интересная Подмигивание

Это очень, очень интересная история.

Угу. Расскажи, а? Улыбка
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #111 - 31. Мая 2006 :: 19:25
Печать  
kms писал(а) 31. Мая 2006 :: 19:19:
Насколько я сейчас представляю, Deb просто конструирует общий класс путем сливания в него всех подкласса и всех суперклассов с каким-то разрешением конфликтов (Артур сказал, что берется первый попавшийся метод с совпадающим именем).

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

Цитата:
Q. А если у меня

класс Наследование = classes\nasled.cls:Справочник.Номенклатура, Документ.Заявка {};
Каким макаром наследуются одинаковые свойства и медоды? Например, Вид()?
A. Если не переопределить Вид() в своем классе, то вызываться будет Вид() для Справочник.Номенклатура, потому как он первый в списке.
  
Наверх
www  
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #112 - 31. Мая 2006 :: 19:28
Печать  
fez писал(а) 31. Мая 2006 :: 19:09:
Повсюду в 1С++ Сам(Контекст) - это ссылка на один и тот же обект. Тот самый, что был создан с помощью СоздатьОбъект(). За одним, нафиг, исключением: когда мы вызываем ЗаменитьЭксзБазовогоКласса(). Вопрос: ПОЧЕМУ?

По идее, метод ЗаменитьБазовыйОбъект() как "плохой" не должен быть экспортным (и соответственно, виртуальным). Но тогда к нему нельзя будет обратиться из модуля, так как доступен он только через Сам(Контекст).

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

К сожалению, его нельзя и переопределить (или можно? тогда как обращаться к базовому?). Похоже, правильным решением будет инкапсулировать его в другой метод, который уже можно будет наследовать, так как в нем можно будет реализовать ту логику, которая больше по душе.
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #113 - 31. Мая 2006 :: 19:29
Печать  
kms писал(а) 31. Мая 2006 :: 19:19:
Поэтому контекст один, и обращаться ты можешь куда хочешь и сколько хочешь.
Это не ООП, но это концепция классов Deb'a. И мы ее любим. Но любит ли она нас?

Не хочет - заставим. Поцелуй Нас много, а она одна.

Кстати, в питоне точно такая же концепция классов, как я уже успел продемонстрировать Улыбка Так что это еще и концепция Гвидо Ван Россума. (во, я и для себя авторитета нашел, теперь и мне есть на кого ссылаться Язык)

В конце концов, твой вопрос 2 - это однозначный вопрос обратной совместимости. И если его решить так, как ТЫ этого хочешь (хотел в начале ветки), то это будет уже совсем другой продукт.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #114 - 31. Мая 2006 :: 19:35
Печать  
sedmin писал(а) 31. Мая 2006 :: 19:28:
По идее, метод ЗаменитьБазовыйОбъект() как "плохой" не должен быть экспортным (и соответственно, виртуальным). Но тогда к нему нельзя будет обратиться из модуля, так как доступен он только через Сам(Контекст).

А ты почему считаешь, что это "плохой" метод. Чем плох с твоей точки зрения?

fez
Не читал FAQ. Ну зачем читать FAQ, когда есть 3 подсказки: звонок другу (Артур), помощь зала (форум) и 100/0 (код).
Чукча не читатель, чукча писатель.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #115 - 31. Мая 2006 :: 19:43
Печать  
fez писал(а) 31. Мая 2006 :: 19:29:
В конце концов, твой вопрос 2 - это однозначный вопрос обратной совместимости. И если его решить так, как ТЫ этого хочешь (хотел в начале ветки), то это будет уже совсем другой продукт.

Ну, ты в ударе. И взаимностью не обижен, с поддержкой авторитетов не обделен Язык

На самом деле, конечно, нельзя менять модель. Все привыкли, код уже написан.
Оставляем контроль корректности доступа на разработчике.
В конце концов, теперь, обращаясь из Документы_СБИ к реквизиту Фирма документа РКО ты будешь оглядываться, не видит ли тебя кто-то из отцов-основателей ООП.

Мне этого достаточно Смех

P.S.
Если мы поменяем модель, Sedmin нас точно не простит.
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #116 - 31. Мая 2006 :: 20:23
Печать  
Точно не прощу. Мы уже вовсю используем экспортные методы как виртуальные, и альтернативы этому я не вижу.

Объясню, чем плох метод ЗаменитьБазовыйОбъект(). (А то, можно подумать, вы сами об этом не занете).

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

2. В нормальном языке почему такого метода нет? Потому что там делается
СоздатьОбъект("Наследник").Заполнить(ИдЗаписиБД). Так как в 1С есть две разновидности объектов - те, что создаются через СоздатьОбъект(), и те, которые берутся из ниоткуда (или из фабрики объектов, которая не хочет делать объекты класса "Наследник"), то нужен способ получения наследника из уже готового объекта класса "Родитель".

Для первых объектов годится обычная модель заполнения объектов, а для вторых придумали метод ЗаменитьБазовыйОбъект().

И тут нас ждут грабли: при попытке написать Наследник.ЗаменитьБазовыйОбъект(объект.ТекущийЭлемент()) мы получаем ошибку: "можно использовать только объект, созданный через СоздатьОбъект(), или ГрупповойКонтекст".

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

Остается одно применение методу - создавать наследников для форм документов и справочников. (кстати, интересно, что если создавать наследников формам списков?) Должен этот метод быть для этого полиморфным? Не знаю.

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #117 - 31. Мая 2006 :: 20:38
Печать  
sedmin писал(а) 31. Мая 2006 :: 20:23:
Точно не прощу. Мы уже вовсю используем экспортные методы как виртуальные, и альтернативы этому я не вижу.

Как раз с доступом к виртуальным функциям, реализованным через нормальный интерфейс (декларация в базе и определение в подклассе или определение в базе и переопределение в подклассе) ничего не случится при любом раскладе.

Цитата:
И тут нас ждут грабли: при попытке написать Наследник.ЗаменитьБазовыйОбъект(объект.ТекущийЭлемент()) мы получаем ошибку: "можно использовать только объект, созданный через СоздатьОбъект(), или ГрупповойКонтекст".

А оно надо, использовать для бесконтекстных объектов? Я тоже думал на эту тему.
  

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


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

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

Напомните мне, пожалуйста
Мы уже рассматривали идею динамического конструирования иерархии классов на этапе выполнения?
Дело в том, что у нас нет классов, как таковых. Мы имеем дело с наборами контекстов с логикой замещения методов.
Ну и почему тогда не конструировать объекты налету?

Типа
Цитата:
// создание шаблона
// возьмем за основу пример Федора
Класс = СоздатьКласс("Документ.РКО"); // создание класса

// конструирование
Класс.ДобавитьСуперкласс("Документы_СБИ", ""); // имя класса, уровень иерархии

// переопределение виртуальных функций
Класс.ДобавитьПодкласс("Документ_РКО", ""); // имя класса, уровень иерархии

Если ПризнакУчета = "НафНаф" Тогда

   // переопределение виртуальных функций подкласса
   Сам.ДобавитьПодкласс("Документы_РКО_УчетНафНаф", "Документ_РКО");

КонецЕсли;

// инстанциирование объекта
Сам = Класс.СоздатьОбъект(...); // вызов конструкторов в соотв. с иерархией
Сам.ЗаменитьБазовыйОбъект("Документ.РКО", "Контекст"); // встраивание объекта


Т.е. мы имеем возможность динамического  конструирования иерархии с учетом необходимых суперклассов и подклассов + возможность инстанциирования описанных объектов.

Давайте, критикуйте. Улыбка
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #119 - 01. Июня 2006 :: 04:55
Печать  
Мое мнение: ну его нафиг, такое счастье. Давайте не будем делать того, в чем нет потребности. (Мантра экстемальных программистов: "Нам это никогда не понадобится".)

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

1. В defcls.prm  указывать только расположение файла класса. Все описание класса иметь в файле класса. В том числе  его иерархия, параметры по умолчанию, и т.д.
Примерно как в Яве.

2. Иметь возможность загрузить все файлы классов из каталога. Опять же как в Яве.
  
Наверх
 
IP записан
 
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 &amp;&amp; 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 &amp;&amp; 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 записан
 
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 записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #150 - 01. Июня 2006 :: 09:51
Печать  
fez писал(а) 01. Июня 2006 :: 09:40:
Если вдруг из модуля класса Док_Продажа потребуется как-то достучаться до того объекта "Регистры", который базовый для "Регистр_Взаиморасчеты"... Я правильно понимаю, что этого сделать вообще никак невозможно?

При полиморфном поведнии ПолучитьБазовыйКласс да.
При неполиморфном - ПолучитьБазовыйКласс("Регистр_Взаиморасчеты").ПолучитьБазовыйКласс("Регистры").
Хотя всвое время была работающая заготовка с
Регистр_Взаиморасчеты__класс__Регистры__класс__МетодКлассаРегистры();
и
Регистр_Товары__класс__Регистры__класс__МетодКлассаРегистры();
(то бишь без сам(Контекст) вообще. Компилится в номера методов сразу)
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #151 - 01. Июня 2006 :: 09:54
Печать  
kms писал(а) 01. Июня 2006 :: 09:49:
Блин, сначала скажите мне вот это:

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


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

Это я не понял, что тут не понятного?
Код
Выбрать все
Сам=Сам(Контекст);
База=Сам.ПолучитьБазовыйКласс("Регистры");
База.БазовыйМетод();
 

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


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

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

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #153 - 01. Июня 2006 :: 09:58
Печать  
orefkov писал(а) 01. Июня 2006 :: 09:51:
fez писал(а) 01. Июня 2006 :: 09:40:
Если вдруг из модуля класса Док_Продажа потребуется как-то достучаться до того объекта "Регистры", который базовый для "Регистр_Взаиморасчеты"... Я правильно понимаю, что этого сделать вообще никак невозможно?

При полиморфном поведнии ПолучитьБазовыйКласс да.
При неполиморфном - ПолучитьБазовыйКласс("Регистр_Взаиморасчеты").ПолучитьБазовыйКласс("Регистры").


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

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #154 - 01. Июня 2006 :: 09:59
Печать  
Тема текущей схемы разрешения ромбов раскрыта.
  

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: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #155 - 01. Июня 2006 :: 10:06
Печать  
Хотя стоп.
Метод не может быть полиморфным или не полиморфным. Вызов метода может быть полиморфным
То, что возвращается после выполнения .Вид() напрямую зависит от того, что находится до точки, а не после.
Если написано Сам(Контекст).Вид(), то вызов метода Вид() будет полиморфным.
Если написано Сам(Контекст).получитьБазовыйКласс("Регистр_ВзаиморасчетыПокупателей").Вид(), то этот вызов будет неполиморфным.

Ага?
  
Наверх
www  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #156 - 01. Июня 2006 :: 10:07
Печать  
fez писал(а) 01. Июня 2006 :: 09:58:
Ага. То есть если вдруг у нас есть ромб, и нам из Док_Продажа нужно заменить оба объекта класса "Регистры" на что-то разное, то ПолучитьБазовыйКласс("Регистр_Взаиморасчеты").ЗаменитьЭксзБазовогоКласса() будет работать только пр неполиморфном поведении не только ПолучитьБазовыйКласс(), но и при неполиморфном поведении ЗаменитьЭксзБазовогоКласса().

Мда. Грустно.

А схему с "обратным" вызовом из базового класса метода в наследнике, в котором уже и делается
замена пробовал?
Так все же попроще для пользователя класса будет.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #157 - 01. Июня 2006 :: 10:09
Печать  
Цитата:
Если написано Сам(Контекст).Вид(), то вызов метода Вид() будет полиморфным.
Если написано Сам(Контекст).получитьБазовыйКласс("Регистр_ВзаиморасчетыПокупателей").Вид(), то этот вызов будет неполиморфным.

Неочевидно них#ра.
Но очевидно, что ПолучитьБазовыйКласс() - сейчас не виртуальная функция, а служебная.
  

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


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

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

P.S.
Почему ПолучитьБазовыйКласс()? Должно быть ПолучитьБазовыйОбъект() (синоним)!
  

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #159 - 01. Июня 2006 :: 10:14
Печать  
fez писал(а) 01. Июня 2006 :: 10:06:
Хотя стоп.
Метод не может быть полиморфным или не полиморфным. Вызов метода может быть полиморфным
То, что возвращается после выполнения .Вид() напрямую зависит от того, что находится до точки, а не после.
Если написано Сам(Контекст).Вид(), то вызов метода Вид() будет полиморфным.
Если написано Сам(Контекст).получитьБазовыйКласс("Регистр_ВзаиморасчетыПокупателей").Вид(), то этот вызов будет неполиморфным.

Ага?


Вот тут собака и порылась. Сам(Контекст) всегда возвращает контекст КОНЕЧНОГО класса. Именно для полиморфности.
Вот допустим мы пишем
Код
Выбрать все
// Класс Базовый
Процедура Показать() Экспорт
    Сообщить(ТипЗначенияСтр(Сам(Контекст));
....
класс Наследник: Базовый{};
....
тест=СоздатьОбъект("Базовый");
тест.Показать();
тест=СоздатьОбъект("Наследник");
тест.Показать();
 


Поимеем:
Базовый
Наследник

То есть обращение к любым методам через Сам(Контекст) - всегда полиморфно.
Неполиморфность при вызове ПолучитьБазовыйКласс и ЗаменитьЭксзБазовогоКласса через этот же
Сам(Контекст) достигается ИСКУСТВЕННО в 1cpp.dll
  
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #160 - 01. Июня 2006 :: 10:16
Печать  
Вы что, издеваетесь? Приведенный пример не лезет ни в какие ворота! Здесь однозначно должно быть агрегирование! По этой причине нельзя отключать полиморфность.

Здесь даже не ромбовидное наследование. Мы здесь пытаемся унаследовать один объект от двух объектов (не классов) враз. Такого не бывает. При наследовании от двух классов враз эти классы должны смешиваться в один класс. И для него порождаться один смешанный объект. (Это я, конечно, утрирую.)

Что будет, если сделать регистр -  наследник от регистра "Товары" и регистра "Взаимозачеты". Что это будет за регистр такой? Правильно сделать какой-то объект, который ВКЛЮЧАЕТ в себя два регистра.

Если же рассматривать полиморфность каких-либо методов при ромбовидном наследовании, то давайте рассмотрим где действительно имеется ромбовидное наследование. Тогда станет понятно, что будет с методами.

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


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

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

Твое отношение к проблеме:
Код
Выбрать все
// Класс Базовый
....
класс Наследник: Базовый{};
Процедура Показать() Экспорт
    Сообщить(ТипЗначенияСтр(Сам(Контекст));
....
тест=СоздатьОбъект("Базовый");
тест.Показать();
тест=СоздатьОбъект("Наследник");
тест.Показать();
 


Получится
- ошибка (нет функции)
- наследник

Проблема: полиморфное поведение без декларации интерфейса.
  

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #162 - 01. Июня 2006 :: 10:21
Печать  
kms писал(а) 01. Июня 2006 :: 10:18:
orefkov

Твое отношение к проблеме:
Получится
- ошибка (нет функции)
- наследник

Проблема: полиморфное поведение без декларации интерфейса.

При чем тут мое отношение к твоей проблеме?
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

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

Если это моя проблема, а не проблема реализации, то не причем.

Равно как и обращение из одного суперкласса напрямую в другой суперкласс, и из суперкласса к свойствам подкласса.

Изменено:
Да, это моя проблема. Ты, видимо, не причем, если тебе не интересно.
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #164 - 01. Июня 2006 :: 10:23
Печать  
ПолучитьБазовыйКласс() - это вообще не метод, а оператор dynamic_cast.

Оператор dynamic_cast, он полиморфный или нет?
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #165 - 01. Июня 2006 :: 10:29
Печать  
orefkov писал(а) 01. Июня 2006 :: 10:14:
Вот тут собака и порылась. Сам(Контекст) всегда возвращает контекст КОНЕЧНОГО класса. Именно для полиморфности.
[...]
То есть обращение к любым методам через Сам(Контекст) - всегда полиморфно.
Неполиморфность при вызове ПолучитьБазовыйКласс и ЗаменитьЭксзБазовогоКласса через этот же
Сам(Контекст) достигается ИСКУСТВЕННО в 1cpp.dll


Вот я и спрашиваю: а нужна ли нам исскуственная неполиморфность ЗаменитьЭксзБазовогоКласса? Если у нас уже есть исскуственная неполиморфность ПолучитьБазовыйКласс.
Мне кажется, что не нужна.
  
Наверх
www  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #166 - 01. Июня 2006 :: 10:30
Печать  
sedmin писал(а) 01. Июня 2006 :: 10:16:
Вы что, издеваетесь? Приведенный пример не лезет ни в какие ворота! Здесь однозначно должно быть агрегирование! По этой причине нельзя отключать полиморфность.

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

sedmin писал(а) 01. Июня 2006 :: 10:16:
Здесь даже не ромбовидное наследование. Мы здесь пытаемся унаследовать один объект от двух объектов (не классов) враз. Такого не бывает. При наследовании от двух классов враз эти классы должны смешиваться в один класс. И для него порождаться один смешанный объект. (Это я, конечно, утрирую.)

Да уж. Похоже слова умные знают все. А про virtual и не virtual наследование отнюдь не все.
Так прямо и не бывает такого?
Объясни тогда разницу:
Код
Выбрать все
class Base
{
};

class SomeClass : public Base
{
};

class OtherClass : public Base
{
};

class Derived1 : public SomeClass, public OtherClass
{
};

class Derived2 : virtual public SomeClass, virtual public OtherClass
{
};
 


Вот пожалуста разницу между Derived1 и Derived2, и в котором из них "ромбовидное" наследование.
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #167 - 01. Июня 2006 :: 10:34
Печать  
fez писал(а) 01. Июня 2006 :: 10:29:
orefkov писал(а) 01. Июня 2006 :: 10:14:
Вот тут собака и порылась. Сам(Контекст) всегда возвращает контекст КОНЕЧНОГО класса. Именно для полиморфности.
[...]
То есть обращение к любым методам через Сам(Контекст) - всегда полиморфно.
Неполиморфность при вызове ПолучитьБазовыйКласс и ЗаменитьЭксзБазовогоКласса через этот же
Сам(Контекст) достигается ИСКУСТВЕННО в 1cpp.dll


Вот я и спрашиваю: а нужна ли нам исскуственная неполиморфность ЗаменитьЭксзБазовогоКласса? Если у нас уже есть исскуственная неполиморфность ПолучитьБазовыйКласс.
Мне кажется, что не нужна.



Сформулирую вопрос немного иначе.

Если у нас вызов методов через Сам(Контекст) всегда полиморфен, а через Сам(Контекст).ПолучитьБазовыйКласс() - всегда неполиморфен: то нужна ли нам в еще и повсеместная неполиморфность ЗаменитьЭксзБазовогоКласса(), которая наблюдается сейчас
???
  
Наверх
www  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #168 - 01. Июня 2006 :: 10:34
Печать  
kms писал(а) 01. Июня 2006 :: 10:22:
Если это моя проблема, а не проблема реализации, то не причем.

Равно как и обращение из одного суперкласса напрямую в другой суперкласс, и из суперкласса к свойствам подкласса.

Изменено:
Да, это моя проблема. Ты, видимо, не причем, если тебе не интересно.

Мне интересно. Вроде я привел вполне рабочий пример, правда с пропусками несущественных деталей.
Если у тебя что-то не так, приведи пожалуста точно defcls.prm, модули классов, и текст прверяющего метода.
  
Наверх
 
IP записан
 
sedmin
1c++ developer
Отсутствует


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #169 - 01. Июня 2006 :: 10:36
Печать  
orefkov
Зачем нам в 1С++ разбираться в тонкостях виртуального наследования? Разве больше нечем заняться?

Приведенный тобой пример некорректен. Приведи более-менее реальный пример и я готов его обсудить. Надуманные примеры с виртуальным наследованием обсуждать желания нет.
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #170 - 01. Июня 2006 :: 10:37
Печать  
orefkov писал(а) 01. Июня 2006 :: 10:34:
Если у тебя что-то не так, приведи пожалуста точно defcls.prm, модули классов, и текст прверяющего метода.

Угу, и пожалуйста, в другой ветке. А то я так никогда и не добьюсь ответа на свой вопрос из (0).
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #171 - 01. Июня 2006 :: 10:38
Печать  
fez писал(а) 01. Июня 2006 :: 10:29:
Вот я и спрашиваю: а нужна ли нам исскуственная неполиморфность ЗаменитьЭксзБазовогоКласса? Если у нас уже есть исскуственная неполиморфность ПолучитьБазовыйКласс.
Мне кажется, что не нужна.

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

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #172 - 01. Июня 2006 :: 10:40
Печать  
fez писал(а) 01. Июня 2006 :: 10:34:
Если у нас вызов методов через Сам(Контекст) всегда полиморфен, а через Сам(Контекст).ПолучитьБазовыйКласс() - всегда неполиморфен: то нужна ли нам в еще и повсеместная неполиморфность ЗаменитьЭксзБазовогоКласса(), которая наблюдается сейчас
???

Поясню. Допустим я в своем классе пишу метод, в котором заменяю базовый класс.
Я расчитываю, что в какую бы иерархию в дальнейшем не встраивали мой класс, данный вызов заменит именно тот объект, который мне нужен. Если же ЗаменитьБазовыйКласс будет полиморфен (то есть начинает искать объект базового класса, начиная с конечного, а не с того, из которого он вызывался) это НЕГАРАНТИРОВАНО.
Я не застрахован от того, что мой класс не войдет опосредовано в иерархию какого-либо класса дважды.
И тогда этот метод будет заменять не тот объект, который мне нужен.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #173 - 01. Июня 2006 :: 10:41
Печать  
orefkov писал(а) 01. Июня 2006 :: 10:34:
kms писал(а) 01. Июня 2006 :: 10:22:
Если это моя проблема, а не проблема реализации, то не причем.

Равно как и обращение из одного суперкласса напрямую в другой суперкласс, и из суперкласса к свойствам подкласса.

Изменено:
Да, это моя проблема. Ты, видимо, не причем, если тебе не интересно.

Мне интересно. Вроде я привел вполне рабочий пример, правда с пропусками несущественных деталей.
Если у тебя что-то не так, приведи пожалуста точно defcls.prm, модули классов, и текст прверяющего метода.

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

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


I Hate Fat YaBB 2!

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

Зачем нам лезть туда же, повторять пройденное в С++? Если уж нам так нужно множественное наследование, то предлагаю ограничиться предложением Федора.

fez писал(а) 01. Июня 2006 :: 10:34:
Если у нас вызов методов через Сам(Контекст) всегда полиморфен, а через Сам(Контекст).ПолучитьБазовыйКласс() - всегда неполиморфен: то нужна ли нам в еще и повсеместная неполиморфность ЗаменитьЭксзБазовогоКласса(), которая наблюдается сейчас?


Если уж нужно быть уверенным, что ты заменяешь нужный объект, то ты можешь написать
Сам(Контекст).ПолучитьБазовыйКласс("ТекущийКласс").ЗаменитьБазовыйОбъект().

Правда такой код не сработает. Улыбка
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

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

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


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #176 - 01. Июня 2006 :: 10:46
Печать  
kms писал(а) 01. Июня 2006 :: 10:41:
Саша, я же полностью вопрос привел. Ты просто опять проехал мимо.
Ты считаешь корректным обращение из одного суперкласса к методам и свойствам другого, связанного только общим подклассом, или нет? Разве это неясный вопрос?


В другую ветку шагом марш!
Я вот не считаю корректным заведение ромбовидного наследования, однако я почему-то не бросаюсь обсуждать еще и этот вопрос в одной ветке.
  
Наверх
www  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #177 - 01. Июня 2006 :: 10:47
Печать  
sedmin писал(а) 01. Июня 2006 :: 10:36:
orefkov
Зачем нам в 1С++ разбираться в тонкостях виртуального наследования? Разве больше нечем заняться?
Приведенный тобой пример некорректен. Приведи более-менее реальный пример и я готов его обсудить. Надуманные примеры с виртуальным наследованием обсуждать желания нет.

Чем он не корректен?
Объясни лучше ты, где указано, что НЕЛЬЗЯ отнаследоватся от двух классов, если у них одинаковые базовые классы. Только не надо приводить рассуждения на тему, когда лучше наследование, когда агрегирование.
Просто скажи, почему НЕЛЬЗЯ.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #178 - 01. Июня 2006 :: 10:49
Печать  
fez писал(а) 01. Июня 2006 :: 10:46:
kms писал(а) 01. Июня 2006 :: 10:41:
Саша, я же полностью вопрос привел. Ты просто опять проехал мимо.
Ты считаешь корректным обращение из одного суперкласса к методам и свойствам другого, связанного только общим подклассом, или нет? Разве это неясный вопрос?


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

Да бога ради, могу вас покинуть. Бай.
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #179 - 01. Июня 2006 :: 10:56
Печать  
orefkov писал(а) 01. Июня 2006 :: 10:47:
Объясни лучше ты, где указано, что НЕЛЬЗЯ отнаследоватся от двух классов, если у них одинаковые базовые классы. Только не надо приводить рассуждения на тему, когда лучше наследование, когда агрегирование.
Просто скажи, почему НЕЛЬЗЯ.


МОЖНО. Но не НУЖНО. Пусть сочинители С++ и монстры С++ разбираются в проблемах множественного наследования. Я считаю, что нам это незачем.

Ты приведи пример, когда это хотя бы КРАЙНЕ ЖЕЛАТЕЛЬНО.
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #180 - 01. Июня 2006 :: 10:59
Печать  
fez писал(а) 01. Июня 2006 :: 10:46:
В другую ветку шагом марш!

Соответствующие ветки я завел. Дальнейший оффтопик в этой ветке будет жестко пресекаться.
  
Наверх
www  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

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

Сделал декомпозицию? Молодец. Смысл стал более понятен?
Не забудь сделать композицию на выходе.
  

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


I Hate Fat YaBB 2!

Сообщений: 862
Зарегистрирован: 24. Мая 2006
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #182 - 01. Июня 2006 :: 11:11
Печать  
Может быть, нужен метод ПривестиККлассу("ИмяКласса"), Который будет полиморфным, но будет позволять производить любые приведения.

Например:
Объект.ПривестиККлассу("ТекущийКласс").ПривестиККлассу("МойРодитель")?
Ах, нет. При дальнешем ромбовидном наследовании опять будет лажа.

Таким образом, нужен метод ПреобразоватьКТекущемуКлассу().

А лучше - ну его в баню, ромбовидное наследование. Пусть все будет полиморфным. А тот, кто использует ромбовидное наследование с заменой базовых объектов, пусть тот наступает на грабли.  Улыбка
  
Наверх
 
IP записан
 
fez
Forum Administrator
1c++ power user
Отсутствует


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

Сообщений: 2712
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Полиморфизм ЗаменитьЭксзБазовогоКласса
Ответ #183 - 01. Июня 2006 :: 12:09
Печать  
  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать