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