Переключение на Главную Страницу Страницы: 1 ... 9 10 [11] 12 13  ОтправитьПечать
Очень популярная тема (более 25 ответов) Полиморфизм ЗаменитьЭксзБазовогоКласса (число прочтений - 77173 )
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 записан
 
Переключение на Главную Страницу Страницы: 1 ... 9 10 [11] 12 13 
ОтправитьПечать