Мне тут понадобилось переписать заново одну старую програмулину (написанную на С++). И я занялся изучением новомодных тенденций. Хотелось идти в ногу со временем и использовать что-то современное (ладно, кандидатами были C# и Java). Но беда заключается в том, что в старом коде используется множественное наследование почти везде. В двух словах, там есть несколько базовых функционалов (десятка три), реализованных своими классами. А рабочие классы используют то, что им надо (обычно от 5 до 15 родителей) и переопределяют некоторые операции. Так вот возник вопрос, как же без множественного наследования люди обходятся? Поделитесь опытом
ЗЫ: Вопрос о выборе средства разработки уже не стоит, С++ однозначно.
Здравствуйте, Leshi, Вы писали:
L>Мне тут понадобилось переписать заново одну старую програмулину (написанную на С++). И я занялся изучением новомодных тенденций. Хотелось идти в ногу со временем и использовать что-то современное (ладно, кандидатами были C# и Java). Но беда заключается в том, что в старом коде используется множественное наследование почти везде. В двух словах, там есть несколько базовых функционалов (десятка три), реализованных своими классами. А рабочие классы используют то, что им надо (обычно от 5 до 15 родителей) и переопределяют некоторые операции. Так вот возник вопрос, как же без множественного наследования люди обходятся? Поделитесь опытом
L>ЗЫ: Вопрос о выборе средства разработки уже не стоит, С++ однозначно.
Дык если язык разработки будет С++ то зачем отказываться от множественного наследования ?
L>Так вот возник вопрос, как же без множественного наследования люди обходятся? Поделитесь опытом
— использовать интерфейсы
— хорошо проектировать иерархию наследования
— использовать включение классов с нужным функционалом и переадресацию вызовов на них (интерфейсы скрывают это от пользователей класса)
— ну и приходиться извращаться — использовать неявные преобразования, reflection
вобщем бывает тяжело без множественного наследования, но в большинстве случаев жить можно
Здравствуйте, _Obelisk_, Вы писали:
_O_>Дык если язык разработки будет С++ то зачем отказываться от множественного наследования ?
Дык поэтому и С++, что остальное без множественного наследования.
Здравствуйте, Banch, Вы писали:
L>>Так вот возник вопрос, как же без множественного наследования люди обходятся? Поделитесь опытом
B>- использовать интерфейсы
В данном случае интерфейсы описывают только что делать, а уж как приходится думать в реализации. Это, как бы это по-мягче, неудобно. B>- хорошо проектировать иерархию наследования
Хорошо уже не получается, приходится думать о том, куда это все запихать. Ведь если, допустим, у меня есть функционал записи на диск и функционал записи в базу данных это же две разные вещи. Объединять их в один класс нет надобности, а придется B>- использовать включение классов с нужным функционалом и переадресацию вызовов на них (интерфейсы скрывают это от пользователей класса)
Это, кажется, называется изврат? B>- ну и приходиться извращаться — использовать неявные преобразования, reflection
B>вобщем бывает тяжело без множественного наследования, но в большинстве случаев жить можно
Ну не понимаю я, почему в таком случае C# и Java так рьяно отстаиваются их сторонниками. Это же сырые язяки получаются... (ща побъют)
Здравствуйте, Leshi, Вы писали:
B>>вобщем бывает тяжело без множественного наследования, но в большинстве случаев жить можно
L>Ну не понимаю я, почему в таком случае C# и Java так рьяно отстаиваются их сторонниками. Это же сырые язяки получаются... (ща побъют)
C# и Java — скоро станут устаревшими. Обратите внимание, например, на язык Zonnon (это потомок от языка Active Oberon for .NET). Там множественное наследование есть! Просто создатели C# и Java выплеснули вместе с водой и ребенка открестившись от множественного наследования в пользу интерфейсов испугавшись сложностей реализации множественного наследования в языке С++. Но, дело в том, что множественное наследование и язык С++ это вовсе не близнецы-братья, а разные вещи. Множественное наследование можно реализовать подругому, не так как в С++. В результате все вкусности множественного наследования в языке Zonnon присутствуют, в тоже самое время нет ни одного недостатка множественного наследования присущих реализации оного в С++.
Здравствуйте, Leshi, Вы писали:
B>>- использовать интерфейсы L>В данном случае интерфейсы описывают только что делать, а уж как приходится думать в реализации. Это, как бы это по-мягче, неудобно. B>>- хорошо проектировать иерархию наследования L>Хорошо уже не получается, приходится думать о том, куда это все запихать. Ведь если, допустим, у меня есть функционал записи на диск и функционал записи в базу данных это же две разные вещи. Объединять их в один класс нет надобности, а придется B>>- использовать включение классов с нужным функционалом и переадресацию вызовов на них (интерфейсы скрывают это от пользователей класса) L>Это, кажется, называется изврат?
Это называется агрегирование. Через него делается множественное как-бы-наследование в COM.
Здравствуйте, Leshi, Вы писали:
L>Мне тут понадобилось переписать заново одну старую програмулину (написанную на С++). И я занялся изучением новомодных тенденций. Хотелось идти в ногу со временем и использовать что-то современное (ладно, кандидатами были C# и Java). Но беда заключается в том, что в старом коде используется множественное наследование почти везде. В двух словах, там есть несколько базовых функционалов (десятка три), реализованных своими классами. А рабочие классы используют то, что им надо (обычно от 5 до 15 родителей) и переопределяют некоторые операции. Так вот возник вопрос, как же без множественного наследования люди обходятся? Поделитесь опытом
Как я обхожусь в Java: куча мелких компонентиков и Spring, их связывающий. Соответственно, вместо сильной зависимости наследование активно используется более слабая — композиция.
Здравствуйте, LuciferMoscow, Вы писали:
LM>Как часто ты используешь множественное наследование? Думаю далеко не в каждом проекте. Лично мне приходилось сталкиватся с ним <=2 раз за три года
За 10 лет у меня небыло ни одного проекта, где я не использовал бы множественного наследования. Хотя я слонен считать это стилем программирования (который обсуждать не буду)
Здравствуйте, Сергей Губанов, Вы писали:
СГ>C# и Java — скоро станут устаревшими.
Смело... СГ>Обратите внимание, например, на язык Zonnon
Маленький для меня. Лет через пять можно будет подумать. Вкладывать в него ресурсы (время и деньги) кажется мне слишком рисковым. Мне нужен более или менее успешний в коммерческом плане язык. Так что пока поищем (но не слишком уж активно) альнернативу С++ в других местах.
Leshi пишет: > СГ>Обратите внимание, например, на язык Zonnon <http://www.zonnon.ethz.ch/> > Маленький для меня. Лет через пять можно будет подумать. Вкладывать в > него ресурсы (время и деньги) кажется мне слишком рисковым. Мне нужен > более или менее успешний в коммерческом плане язык. Так что пока поищем > (но не слишком уж активно) альнернативу С++ в других местах.
Ну, в Eifell есть множественное наследование. Он есть для .Net.
--
Andrei N.Sobchuck
JabberID: andreis@jabber.ru. ICQ UIN: 46466235.
Сергей Губанов пишет:
> L>Ну не понимаю я, почему в таком случае C# и Java так рьяно > отстаиваются их сторонниками. Это же сырые язяки получаются... (ща побъют) > C# и Java — скоро станут устаревшими. Обратите внимание, например, на > язык Zonnon <http://www.zonnon.ethz.ch/> (это потомок от языка Active > Oberon for .NET). *Там множественное наследование есть!*
Которое является просто синтаксическим сахаром над интерфейсами. Ни
Java, ни .NET не запрещают использовать множественное наследование, они
лишь запрещают множественное наследование классов на уровне CLI.
Множественно наследование на уровне прикладного языка замечательно
выражается с помощью интерфейсов.
Здравствуйте, prVovik, Вы писали:
К>>Это называется агрегирование. V>Точнее, делегирование...
Таки агрегирование! Именно агрегирование в связке с интерфейсами (или даже без них) является заменой (а точнее эквивалентом) множествунному наследованию.
Здравствуйте, softilium, Вы писали:
S>Таки агрегирование! Именно агрегирование в связке с интерфейсами (или даже без них) является заменой (а точнее эквивалентом) множествунному наследованию.
точно, точно...
VladD2 пишет: > ANS>Ну, в Eifell есть множественное наследование. Он есть для .Net. > > Проблемы тоже есть. Реализация не компонентная. По сути просто создается > третий класс в который копируются два базовых.
Это почему не компонентная? Как по мне, то реализация вполне нормальная.
--
Andrei N.Sobchuck
JabberID: andreis@jabber.ru. ICQ UIN: 46466235.
Здравствуйте, LuciferMoscow, Вы писали:
LM>Здравствуйте, Leshi, можешь привести пример, где не обойтись без множественного наследования? Наиболее реальный
Я могу привести пример, где множественное наследование будет самым элегантным способом. Я даже не пытаюсь спорить о том, что без множественного наследования нельзя обойтись. Вконце концов в машинном коде понятия объект вообще не существует