V>Таким образом, я считаю нецелесообразным использование множественного наследования ввиду того, что в процессе развития проекта очень легко можно нарваться на трудноустранимые проблемы, связанные с множественным наследованием. То есть это как бомба замедленного действия. Я уверен, что лучше сразу потратить чуть-чуть больше усилий и воспользоваться интерфейсами, но потом спать спокойно.
Любая программная система имеет два пространства — пространство задачи и пространство решения. С моей точки зрения, множественное наследование (даже интерфейсов) — это не очень удачный инструмент для моделирования предметной области, где действительно получаются гибриды ежа с ужом. Но, с другой стороны, множественное наследование в пространстве решения, применяемое с умом, — это очень мощный и удобный инструмент, который часто позволяет сделать программу выразительнее и короче. Что-то типа
class ATL_NO_VTABLE CXyz:
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CXyz, &CLSID_Xyz>,
public IDispatchImpl<IXyz, &IID_IXyz, &LIBID_ATLXyzLib, 1, 0>
{
...
};
Почему множественного наследования нет в C#? Я думаю потому, что его нет в яве и объект-паскале Почему его нет в яве? Видимо, как здесь уже говорили, из-за трудностей со сборкой мусора и тем, что все классы должны наследоваться от Object, что и приводит к ромбовидному наследованию в ста процентах случаев...
Вообще, я не понимаю, почему, с точки зрения многих противников МН, одиночное наследование — допустимо? По мне, так это просто вырожденный случай, которые несет все его недостатки и достоинства. Если быть последовательным, то надо либо вообще не использовать наследование реализации, либо признать, что применяемое с умом множественное наследование ничуть не хуже одиночного.
Re[3]: Зачем отказались от множественного наследования в С#?
Здравствуйте, Nikolay_Ch, Вы писали:
MS>>Инапсуляция — да! Полиморфизм — 256 раз да! Наследование — отказать. Ибо нету такой штуки в природе, ну нету. Точнее есть, но она совсем из другой оперы. N_C>Как это нету? А симбиоз организмов? Его можно рассматривать как некий механизм наследования.
Какой симбиоз? симбиоз — это два разных класса, "живущих" в одном namespace наследованием тут не пахнет.
Автоматизация.ERP
Re[2]: Зачем отказались от множественного наследования в С#?
Здравствуйте, minorlogic, Вы писали:
M>Мои 2 копейки в защиту множественного наследования.
M>Ромбовидное наследование для реализации базового интерфейса "интрузивный подсчет ссылок"
M>есть альтернативы ?
Если бы таписал еще что это значит.
Re[4]: Зачем отказались от множественного наследования в С#?
Al_>Какой симбиоз? симбиоз — это два разных класса, "живущих" в одном namespace наследованием тут не пахнет.
Ну, а если рассматривать полученный организм, как один? Или один внутри другого?
Re[8]: Зачем отказались от множественного наследования в С#?
Здравствуйте, Cyberax, Вы писали:
>> ИМХО, перезагрузку сигнатур ф-ий тоже стоило бы отнести к определенному >> виду полиморфности, если считать за таковую специализацию шаблонов. Как >> тебе? C>Ну как бы оно тоже считается "статическим полиморфизмом".
Офигеть.
В этом случае все элементы статически-типизированных языков претендуют на статический полиморфизм.
Например:
operator+(int, int)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[9]: Зачем отказались от множественного наследования в С#?
vdimas wrote: > C>Ну как бы оно тоже считается "статическим полиморфизмом". > Офигеть. > В этом случае все элементы статически-типизированных языков претендуют > на статический полиморфизм. > Например: > operator+(int, int)
Нет, не все. Язык С (и всякие там Pascal'и, и не побоюсь этого слова,
Oberon) не поддерживают перегрузку методов.
То есть:
procedure DoBlah(var a : Integer);
procedure DoBlah(var a : SomeType);
procedure DoBlah(var a : String);
такой код там невозможен.
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re[3]: Зачем отказались от множественного наследования в С#?
Здравствуйте, Lloyd, Вы писали:
M>>Ромбовидное наследование для реализации базового интерфейса "интрузивный подсчет ссылок"
L>Если бы таписал еще что это значит.
----- *.h ----
class irefference_counted
{
virtual ~irefference_counted(){}
public:
virtual int add_refference() = 0;
virtual int release() = 0;
};
class imy_cool_interface : public virtual irefference_counted
{
public:
virtual int do_cool_stuff() = 0;
};
class imy_cool_interface2 : public virtual irefference_counted
{
public:
virtual int do_cool_stuff2() = 0;
};
----- *.cpp ----
class base_refference_counted : public virtual irefference_counted
{
int count;
public:
int add_refference()
{
count++;
}
int release()
{
count--;
if(!count)
delete this;
}
};
class my_cool_interface_impl : public virtual imy_cool_interface, public virtual irefference_counted
{
......
};
class my_cool_interface_impl2 : public virtual imy_cool_interface2, public virtual irefference_counted
{
......
};
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[5]: Зачем отказались от множественного наследования в С#?
Здравствуйте, Nikolay_Ch, Вы писали:
Al_>>Какой симбиоз? симбиоз — это два разных класса, "живущих" в одном namespace наследованием тут не пахнет. N_C>Ну, а если рассматривать полученный организм, как один? Или один внутри другого?
И вот опять мы вернулись к Канту
не... я бы все равно не стал наследовать.
Автоматизация.ERP
Re[7]: Зачем отказались от множественного наследования в С#?
Здравствуйте, Кодёнок, Вы писали:
Кё>Здравствуйте, Ramzes_, Вы писали:
R_>>Интересно, а причем тут есть это в природе, или нет. Понятие искусственности/естественности метода не мало влияет на его практическую ценность. Программист он не биолог, все-таки. Кё>вот я и говорю Кё>во-первых, программирование, как и математика, это чисто абстрактный придуманный мир, где мы создаем такие понятия какие хотим, и отсутствие аналогов в природе никак не может быть аргументом к целесообразности использования того или иного понятия в мире абстракций.
Кё>во-вторых, проводить аналогии с реальным миром значить ограничить сам себя, потому что в реальном мире "наследование" может иметь такие последствия, которые невозможны в вашем языке программирования, и наоборот, ваша реализация наследования в ЯП может давать такие эффекты, которых в реальном мире нет.
Категорически не согласен. Программирование должно быть... или нет, не "должно быть", а должно иметь возможность быть тесно связанным с тем миром для которого реализуется программный код.
В идеале программист должен оперировать теми-же объектами, что и любой другой нормальный человек. Не надо уходить от реальности.
Автоматизация.ERP
Re[2]: Зачем отказались от множественного наследования в С#?
Здравствуйте, Al_, Вы писали:
Al_>Категорически не согласен. Программирование должно быть... или нет, не "должно быть", а должно иметь возможность быть тесно связанным с тем миром для которого реализуется программный код.
Ты плохо понимаешь что сам делаешь. Программист работает не с реальным миром, а с его упрощенной моделью. Единственная неупрощенная модель мира — это сам мир.
Термины "модель", "математическая модель" тебе знакомы? Объекты модели могут сколь угодно точно отражать моделируемые сущности и отношения, но они не равняются им. И рано или поздно проявят неожиданные свойства в том или ином аспекте.
Al_>В идеале программист должен оперировать теми-же объектами, что и любой другой нормальный человек. Не надо уходить от реальности.
Не путай объекты со своим представлением о них. Они лишь могут оперировать одними и теми же терминами, похожим опытом в отношении одного и того же объекта.
Re[8]: Зачем отказались от множественного наследования в С#?
Здравствуйте, Al_, Вы писали:
Кё>>во-вторых, проводить аналогии с реальным миром значить ограничить сам себя, потому что в реальном мире "наследование" может иметь такие последствия, которые невозможны в вашем языке программирования, и наоборот, ваша реализация наследования в ЯП может давать такие эффекты, которых в реальном мире нет.
Al_>Категорически не согласен. Программирование должно быть... или нет, не "должно быть", а должно иметь возможность быть тесно связанным с тем миром для которого реализуется программный код. Al_>В идеале программист должен оперировать теми-же объектами, что и любой другой нормальный человек. Не надо уходить от реальности.
см. выделенное.
Обычно не программируют живую природу
Я реализую код для автоматизации работы, скажем, операциониста в банке... И что, думаешь, он оперирует понятиями "объект" или "наследование"?
Нет.
Но это не мешает удобно представить сущности с которыми он реально работает в виде объектов
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Зачем отказались от множественного наследования в С#?
Здравствуйте, Трурль, Вы писали:
MS>>Инапсуляция — да! Полиморфизм — 256 раз да! Наследование — отказать. Ибо нету такой штуки в природе, ну нету.
Т>Ну как же нету? Вот умирает дедушка и оставляет в наследство домик в деревне или там престол.
В классическом ООП-наследовании дедушка не умирает, и продолжает владеть царским престолом, хотя и передал его уже наследнику.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[5]: Зачем отказались от множественного наследования в С#?
Должен вас огорчить в вашем коде для каждого класса отдельно компилится своя версия темплейта , это совсем не то что хотелось бы , а именно наслендование реализации.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[5]: Зачем отказались от множественного наследования в С#?
Кстати вы сами не чувстуете притиворечие ? В заголовочный файл интерфейса объекта вносится ИМПЛЕМЕНТАЦИЯ некого класаа.
То есть задача интерфейса во многом , удаление зависимостей между модулями , а внесение имплементации еще и в таком неестетичном виде , мягко говоря этой цели не соответствует .
А еслши класс имеет ОЧЕНЬ простой интерфейс и ОЧЕНЬ сложную реализацию ? на мой взгляд это противоречие.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Ищу работу, 3D, SLAM, computer graphics/vision.
Re[9]: Зачем отказались от множественного наследования в С#?
Здравствуйте, Кодёнок, Вы писали:
Al_>>Категорически не согласен. Программирование должно быть... или нет, не "должно быть", а должно иметь возможность быть тесно связанным с тем миром для которого реализуется программный код.
Кё>Ты плохо понимаешь что сам делаешь.
Смелое заявление
Кё> Программист работает не с реальным миром, а с его упрощенной моделью. Единственная неупрощенная модель мира — это сам мир. Кё>Термины "модель", "математическая модель" тебе знакомы? Объекты модели могут сколь угодно точно отражать моделируемые сущности и отношения, но они не равняются им. И рано или поздно проявят неожиданные свойства в том или ином аспекте.
Тут не поспоришь, но это как раз аргумент в пользу "природного" программирования
Al_>>В идеале программист должен оперировать теми-же объектами, что и любой другой нормальный человек. Не надо уходить от реальности. Кё>Не путай объекты со своим представлением о них. Они лишь могут оперировать одними и теми же терминами, похожим опытом в отношении одного и того же объекта.
Техническое задание приходит через призму восприятия программиста. А программист — такой же человек, он также эволюционировал на протяжении 2х млн. лет, жил одной среде. Мотыги, палки и прочий инструмент — ОНИ определяли его понимание этого мира.
Математика, кстати, тоже появилась не просто так — у человека возникла наобходимость ОЦЕНИВАТЬ те или иные ОБЪЕКТЫ, иметь возможность сравнивать их объективно.
А не так просто: вот я придумаю интеграл... пусть он делает то, то и то. НЕТ. У него есть ФИЗИЧЕСКИЙ СМЫСЛ (ты с этим термином знаком?). Любую единицу измерения наделяют ЭТИМ смыслом.
На основании задания программист строит СВОИ объекты — и не важно, что они отличаются от реальных — важно, чтобы они не отличались от того КАК их видит программист.
Так почему бы программисту не наделить физическим смыслом СВОИ объекты?
А как ты можешь их видеть, если вся твоя история прошла в этом мире, мире физики, мире природы?! ты по другому просто не можешь. У тебя нет такого опыта и быть не может.
Не понимаю зачем этому противиться?!
Автоматизация.ERP
Re[9]: Зачем отказались от множественного наследования в С#?
Здравствуйте, fmiracle, Вы писали:
F>Здравствуйте, Al_, Вы писали:
Кё>>>во-вторых, проводить аналогии с реальным миром значить ограничить сам себя, потому что в реальном мире "наследование" может иметь такие последствия, которые невозможны в вашем языке программирования, и наоборот, ваша реализация наследования в ЯП может давать такие эффекты, которых в реальном мире нет.
Al_>>Категорически не согласен. Программирование должно быть... или нет, не "должно быть", а должно иметь возможность быть тесно связанным с тем миром для которого реализуется программный код. Al_>>В идеале программист должен оперировать теми-же объектами, что и любой другой нормальный человек. Не надо уходить от реальности.
F>см. выделенное. F>Обычно не программируют живую природу F>Я реализую код для автоматизации работы, скажем, операциониста в банке... И что, думаешь, он оперирует понятиями "объект" или "наследование"? F>Нет.
Почему нет?! Ты спроси у нее. Она расскажет тебе — только другими словами. Так как это естественные понятия для человека. Здесь писали, что "наследование" — это не совсем тот термин. Я с этим согласен. Здесь будут разногласия у тебя с операционистом.
Также при желании можешь вытянуть из пользователя понятие "типа объекта" и его "экзампляра".
F>Но это не мешает удобно представить сущности с которыми он реально работает в виде объектов
Автоматизация.ERP
Re[15]: Зачем отказались от множественного наследования в С#
AK>Вот из-за таких как вы приходится неделями разбираться в коде где ежи на велосипедах ездют, хотя ето вообще не надо. Заглядывайте почаще в ветку Архитекрура ПО, Множественное наследование — это зло.
Может, оставите свой менторский тон? Или Вы лично разбирались с моим кодом и имели к нему какие-то претензии? Я прекрасно знаю плюсы и минусы множественного наследования. Но вот таких безапеляционных заявлений претендующих на истину в последней инстанции себе не позволяю.
Re[6]: Зачем отказались от множественного наследования в С#?
M>Кстати вы сами не чувстуете притиворечие ? В заголовочный файл интерфейса объекта вносится ИМПЛЕМЕНТАЦИЯ некого класаа.
Это недостаток C++ — реализацию шаблонных классов в общем случае нельзя вынести в cpp.
M>То есть задача интерфейса во многом , удаление зависимостей между модулями , а внесение имплементации еще и в таком неестетичном виде , мягко говоря этой цели не соответствует .
M>А еслши класс имеет ОЧЕНЬ простой интерфейс и ОЧЕНЬ сложную реализацию ? на мой взгляд это противоречие.
Такая ситуация обходится след. образом — делается нешаблонный класс, куда выносится вся имплементация, а уже шаблон от этого класса наследуется. Согласен, что это будет сильно смахивать на "наследование агрегацией" — поскольку каждый метод шаблона обязан будет явно вызывать метод нешаблонного класса-имплементации.