Re[2]: В чём смыл ограничения в наследовании в C
От: vdimas Россия  
Дата: 24.06.05 07:23
Оценка: 1 (1) +5
Здравствуйте, Varg, Вы писали:

V>2 vdimas


V>] Все-таки, множественное наследование как раз-таки дает бОльшую продуктивность при реализации сложных иерархий.


V>Т.е. при множественном наследовании очень легко создать сложную иерархию. Но со временем иерархия вырастает и становится по сути своей большим карточным домиком, из которого ни вытащить ничего нельзя, ни добавить, без появления багов. Заказчикам это не очень нравится, потому что мало кто из разработчиков хочет получить такой домик в наследство, и как следствие, сильную головную боль. Поэтому в C# нет множественного наследования.




у меня головная боль от чтения подобных необоснованных умозаключений.

Смотри. Берем иерархию стримов. Берем нормальную иерархию, не такую как в дотнет или дельфи.

        StreamBase
        /         \
InputStream       OutputStream
   |    \         /       |
   |   InputOutputStream  |
   |            |         | 
FailInputStream |   FileOutputStream
         \      |      /
      FileInputOutputStream


Есть еще MemoryStream, NetworkStream и т.д. и т.п.

Соответственно, использование очень строгое, мы определяем в сигнатурах ф-ий не просто Stream, как в дотнет, а именно InputStream или OutputStream, т.е. добавляем семантический статический контроль. (путем типизации)

Представляешь, если бы это все было иерархией интерфейсов. как устала бы рука все это имплементировать. А при наличии множественного наследования там просто копейки на класс получились. (реальная либа на C++)

Соотвественно, поддерживать маленькую горку кода все же легче, чем огромную гору.
Re: В чём смыл ограничения в наследовании в C#?
От: Tom Россия http://www.RSDN.ru
Дата: 13.06.05 12:18
Оценка: 22 (4)
Здравствуйте, adontz, Вы писали:

A>Не нашёл ответа, но жутко интересно


A>В чём смысл, что нельзя отнаследоваться от нескольких классов, но можно от одного класса и нескольких интерфейсов?

A>Соответсвенно ключевое слово base для вызова конструктора базового типа не оставляет и надежды, что не абстрактных базовых типов может быть два.

A>В Си++ такого ограничения нет и я нигде не встречал критики по этому поводу.


A>Объясните пожалуйста


Как и сказали уже множественного наследования в .NET нету.
Основной причиной этому является класс object от которого наследованы остальные.
Так, если бы множ. наследование было бы — то приведение к object было бы амбигуз.
Разработчики .NET решили, что множественное наследование не стоит всех выгод, которые даёт один общий предок всех классов — object.
Народная мудрось
всем все никому ничего(с).
Re[2]: В чём смыл ограничения в наследовании в C#?
От: TK Лес кывт.рф
Дата: 18.06.05 07:07
Оценка: +3
Hello, "vdimas"

> А техническая проблема заключается в реализации сборщика мусора, для коего единица сбора — это Object.

>
> Если объект множественно наследован, т.е. инкапсулировал в свое тело несколько Object, то как работать сборщику, если кто-то держит не "головной" объект, а некую его часть — одну из баз?
>

Сборщик мусора тут совершенно не причем. Весь необходимый функционал уже присутствует — достаточно посмотреть на managed указатели. Например, сборщик мусора понимает, что указатель указывает не на объект целиком, а на одно из полей. т.е. сборщик мусора оперирует не единичным указателем, а интервалом (база + размер)
Posted via RSDN NNTP Server 2.0 beta
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Re: В чём смыл ограничения в наследовании в C#?
От: Аноним  
Дата: 13.06.05 12:40
Оценка: :))
>Очень странно, что не встречал.
Ничего странного, ведь речь идет о MS Visual C++, который поддерживает множественное наследование от нескольких классов. А Java, ... это немного другое. Поэтому, кто писал на MS Visual C++ и кажется это немного странным. Ничего страшного в этом нет, со временем привыкаешь.
С уважением, Александр. AlexKD Blog


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: В чём смыл ограничения в наследовании в C#?
От: mihailik Украина  
Дата: 13.06.05 15:56
Оценка: +2
> В Си++ такого ограничения нет и я нигде не встречал критики по этому поводу.

Вот это и странно. Ведь такой критики очень много.

Например, философская проблема: класс X наследуется от A и B, но оба
предка наследуются от одного и того же C. Сколько будет экземпляров
полей класса C в классе X?

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

Платформы типа .NET предназначены для упрощения труда и увеличения
продуктивности. Множественное наследование сильно мешает достижению этих
целей.

Ми.
Posted via RSDN NNTP Server 1.9
Re[2]: В чём смыл ограничения в наследовании в C#?
От: adontz Грузия http://adontz.wordpress.com/
Дата: 13.06.05 16:23
Оценка: +2
Здравствуйте, mihailik, Вы писали:

M>Например, философская проблема: класс X наследуется от A и B, но оба предка наследуются от одного и того же C. Сколько будет экземпляров полей класса C в классе X?


1 или 2 смотря как наследуются, virtual или обычно.

M>А если по-домашнему, то использование множественного наследование невероятно усложняет архитектуру приложения.


Вот уже новость

M>Платформы типа .NET предназначены для упрощения труда и увеличения продуктивности. Множественное наследование сильно мешает достижению этих целей.


Как множественное наследование мешает увеличению продуктивности я не понял. ИМХО наоборот, от чего собственно и возник вопрос. Вместо того, что унаследоваться от ArrayList и Component мне пришлось унаследоваться от Component и оборачивать ArrayList. Как при этом возросла моя продуктивность можно только догадываться.

Думаю всё таки причины чисто человеческие
Во-первых, сама идея общедоступности библиотеки, которую уже давно используют
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfcnotes_tn016.asp

The MFC class library has been designed so that you do not need to understand MI to use MFC. MI is not used in any of the MFC classes. We have found that MI is not required to write a class library, nor is it required for writing serious applications. To use MI or not can be a personal decision, so we leave that decision to you.

И рецензия к данному тексту
http://www.rsdn.ru/Forum/?mid=422868
Автор: Vamp
Дата: 27.10.03

Во-вторых, сложность реализации со стороны компилятора
http://msdn.microsoft.com/chats/transcripts/net/050216_msdn_net_cl.aspx

Q: Possibly a common question, but why do you only support single inheritence?
A: The scenarios for supporting multiple inheritance is rare enough that we made a fundamental decision when we first created the framework to only support single inheritance. This allows us to avoid SO many pitfalls and problems and issues that frankly, when we were shipping V1, allowed us to get the product out the door way faster than we could have otherwise. Now I know that architects in our organization continue to think about how we might do this in the future, but to be honest, it would be unbelievably hard now, probably harder than it was initially (we'd have that whole compatibility thing to worry about, and we have made fundamental CLR decisions assuming single inheritance is in place). It's one of those decisions that we had to make a LONG time ago, and it affects us from that point on.

A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: В чём смыл ограничения в наследовании в C#?
От: Аноним  
Дата: 18.06.05 09:21
Оценка: -2
Глупости, при единичном наследовании указатель указывает всегда только на объект целиком!

В случае же множественного наследования действительно необходимы указатели на "базы" объекта.

Обращение к полям объекта: указатель на объект + смещение переменной.

Есть, например, класс A, который наследует от B и С. Мы создаем переменную класса A, и должны передать ее в какой-нибудь метод, который ожидает параметр типа С. Нам нужно передавать ссылку не на сам объект А (ссылку на его начало), а ссылку именно на "базу" С (по-другому можно сказать, ссылку на адрес в памяти, с которого начинаются переменные класа C).


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: В чём смыл ограничения в наследовании в C#?
От: _FRED_ Черногория
Дата: 13.06.05 00:55
Оценка: 22 (1)
Здравствуйте, adontz, Вы писали:

A>Не нашёл ответа, но жутко интересно

A>В чём смысл, что нельзя отнаследоваться от нескольких классов, но можно от одного класса и нескольких интерфейсов?
A>Соответсвенно ключевое слово base для вызова конструктора базового типа не оставляет и надежды, что не абстрактных базовых типов может быть два.
A>В Си++ такого ограничения нет и я нигде не встречал критики по этому поводу.
A>Объясните пожалуйста

Ключевой момент в отсутствии множественного наследования Напрочь его нету. Ибо нечего . Потому что помимо видимых на первый взгяд бонусах есть получаемые при подробном рассмотрении минусы. Менее расплывчато сказать не могу, но, возможно, это позволит. Язык пытались сделать простым и от такого "багажа" естественно избавились.

Но добрые люди сразу же занались "подключением" реализации — миксинами.
under «*none*»,
... << RSDN@Home 1.1.4 beta 7 rev. 467>>
Help will always be given at Hogwarts to those who ask for it.
Re: В чём смыл ограничения в наследовании в C#?
От: Ael США  
Дата: 13.06.05 04:50
Оценка: 11 (1)
Здравствуйте, adontz, Вы писали:

A>Не нашёл ответа, но жутко интересно


A>В чём смысл, что нельзя отнаследоваться от нескольких классов, но можно от одного класса и нескольких интерфейсов?

A>Соответсвенно ключевое слово base для вызова конструктора базового типа не оставляет и надежды, что не абстрактных базовых типов может быть два.

A>В Си++ такого ограничения нет и я нигде не встречал критики по этому поводу.


A>Объясните пожалуйста


По данной теме
Автор: Ael
Дата: 29.06.04
Re: В чём смыл ограничения в наследовании в C#?
От: Dr.Gigabit  
Дата: 13.06.05 16:39
Оценка: 4 (1)
Здравствуйте, adontz, Вы писали:

A>Не нашёл ответа, но жутко интересно


A>В чём смысл, что нельзя отнаследоваться от нескольких классов, но можно от одного класса и нескольких интерфейсов?

A>Соответсвенно ключевое слово base для вызова конструктора базового типа не оставляет и надежды, что не абстрактных базовых типов может быть два.

A>В Си++ такого ограничения нет и я нигде не встречал критики по этому поводу.


A>Объясните пожалуйста


Вот одно из мнений(касается Java, но идеи те же)

Одна из проблем в ООП становится особенно явной после введения как в C++, где все классы должны быть, в конце концов, наследованы от единственного базового класса. Java (как фактически и во всех ООП языках) отвечает “да” и имя этого единственного базового класса Object. Это позволяет свести иерархию к единому корню.

Все объекты в иерархии с единым корнем имеют общий интерфейс, так что они все приводятся к единому типу. Альтернатива (пришедшая из C++) в том, что вы не знаете, что все исходит из одного и того же фундаментального типа. С точки зрения обратной совместимости это лучше соответствует модели C и можно подумать, что ограничивает меньше, но когда вы хотите применить полное объектно-ориентированное программирование, вы должны построить вашу собственную иерархию, чтобы обеспечить такое же соглашение, которое применено в других языках ООП. А в любых новых библиотеках классов вы получаете, что используются некоторые другие несовместимые интерфейсы. Это требует введения (и возможности множественного наследования) работы с новыми интерфейсами в вашей разработке. Достигнута ли большая “гибкость” в C++? Если вам необходимо это — если вы имеете большие знания в C— это достаточно ценная вещь. Если вы начинаете с начала, другие альтернативы как Java могут часто быть более продуктивными.

Все объекты в иерархии с единым корнем (какую обеспечивает Java) могут гарантировать определенную функциональность. Вы знаете, что можете выполнить определенные базовые операции для каждого объекта вашей системы. Иерархия с единым корнем, наряду с созданием всех объектов в куче, сильно упрощает передачу аргументов (одна из наиболее сложных тем в C++).

Иерархия с единым корнем сильно облегчает реализацию сборщика мусора (который удобно встроен в Java). Необходимость поддержки может быть установлена в базовом классе, а сборщик мусора может посылать определенные сообщения каждому объекту в системе. Без иерархии с единым корнем и системой управления объектами через ссылки сложно реализовать сборщик мусора.

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

Minsk .NET Alliance http://minsk.gotdotnet.ru
Re: В чём смыл ограничения в наследовании в C#?
От: Igor Trofimov  
Дата: 13.06.05 10:28
Оценка: +1
A>В Си++ такого ограничения нет и я нигде не встречал критики по этому поводу.

Очень странно, что не встречал. В описании любого языка, где ограничились именно такой схемой — наследование одной реализации и нескольких интерфейсов — Java, Delphi, теперь вот и C#, обычно как раз сперва рассказывают, как это нехорошо, когда есть множественное наследование реализаций
В чём смыл ограничения в наследовании в C#?
От: Аноним  
Дата: 17.06.05 08:26
Оценка: +1
>В чём смысл, что нельзя отнаследоваться от нескольких классов, но можно от одного класса и нескольких интерфейсов?
Соответсвенно ключевое слово base для вызова конструктора базового типа не оставляет и надежды, что не абстрактных базовых типов может быть два.

Смысл в том, что в случае множественного наследования реализаций (читай классов, поведения) ООП уже перестает быть ООП, как таковым. Ну представьте себе, например, два класса — мужчина и женщина. Оба класса имеют некую общую функцоинальность и свойства, но тем не менее эти классы очень специфичны, поскольку они определяют разное поведение. Теперь представьте, что получится если мы их объединим в новый класс. Опять-таки встает вопрос кто в таком случае предок нового класса? Класс может обладать свойствами различных сущностей (интерфесов), но не поведений.

>В Си++ такого ограничения нет и я нигде не встречал критики по этому поводу.
Странно... На самом деле дискуссий по этому поводу было предостаточно.
Sergey Zhiharev,
<a href=http://blogs.gotdotnet.ru/personal/Torero/&gt; Read my blog </a>


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re: В чём смыл ограничения в наследовании в C#?
От: vdimas Россия  
Дата: 17.06.05 21:20
Оценка: -1
Здравствуйте, adontz, Вы писали:

A>Не нашёл ответа, но жутко интересно


A>В чём смысл, что нельзя отнаследоваться от нескольких классов, но можно от одного класса и нескольких интерфейсов?

A>Соответсвенно ключевое слово base для вызова конструктора базового типа не оставляет и надежды, что не абстрактных базовых типов может быть два.

A>В Си++ такого ограничения нет и я нигде не встречал критики по этому поводу.


A>Объясните пожалуйста


Как мне кажется, основная проблема — техническая. (остальные объяснения про неявную сложность — отмазки )

А техническая проблема заключается в реализации сборщика мусора, для коего единица сбора — это Object.

Если объект множественно наследован, т.е. инкапсулировал в свое тело несколько Object, то как работать сборщику, если кто-то держит не "головной" объект, а некую его часть — одну из баз?

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

Все-таки, множественное наследование как раз-таки дает бОльшую продуктивность при реализации сложных иерархий.
Re: В чём смыл ограничения в наследовании в C
От: Аноним  
Дата: 19.06.05 12:00
Оценка: :)
2 vdimas

] Все-таки, множественное наследование как раз-таки дает бОльшую продуктивность при реализации сложных иерархий.

Т.е. при множественном наследовании очень легко создать сложную иерархию. Но со временем иерархия вырастает и становится по сути своей большим карточным домиком, из которого ни вытащить ничего нельзя, ни добавить, без появления багов. Заказчикам это не очень нравится, потому что мало кто из разработчиков хочет получить такой домик в наследство, и как следствие, сильную головную боль. Поэтому в C# нет множественного наследования.
--
Конкурс 2005: LayeredWindow, Lens, MenuBuilder
Любые комментарии приветствуются!


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[2]: В чём смыл ограничения в наследовании в C
От: Аноним  
Дата: 24.06.05 09:59
Оценка: :)
Можно бесконечно спорить и приводить обоснованные умозаключения по поводу "хорошести" множественного наследования, но
в C# его нет, и скорее всего из ЭКОНОМИЧЕСКИХ соображений. Иначе надо будет признать, что в Microsoft не умеют считать деньги
---
см. мои заявки на конкурсе: LayeredWindow + Lens, MenuBuilder


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
В чём смыл ограничения в наследовании в C#?
От: adontz Грузия http://adontz.wordpress.com/
Дата: 13.06.05 00:07
Оценка:
Не нашёл ответа, но жутко интересно

В чём смысл, что нельзя отнаследоваться от нескольких классов, но можно от одного класса и нескольких интерфейсов?
Соответсвенно ключевое слово base для вызова конструктора базового типа не оставляет и надежды, что не абстрактных базовых типов может быть два.

В Си++ такого ограничения нет и я нигде не встречал критики по этому поводу.

Объясните пожалуйста

25.06.05 21:41: Перенесено модератором из '.NET' — TK
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: В чём смыл ограничения в наследовании в C#?
От: GarryIV  
Дата: 13.06.05 14:41
Оценка:
Hello, Tom!

A>> В чём смысл, что нельзя отнаследоваться от нескольких классов, но можно

A>> от одного класса и нескольких интерфейсов? Соответсвенно ключевое слово
A>> base для вызова конструктора базового типа не оставляет и надежды, что
A>> не абстрактных базовых типов может быть два.

A>> В Си++ такого ограничения нет и я нигде не встречал критики по этому

A>> поводу.

A>> Объясните пожалуйста


T> Как и сказали уже множественного наследования в .NET нету.

T> Основной причиной этому является класс object от которого наследованы
T> остальные. Так, если бы множ. наследование было бы — то приведение к
T> object было бы амбигуз. Разработчики .NET решили, что множественное
T> наследование не стоит всех выгод, которые даёт один общий предок всех
T> классов — object.

Отсутствие множественного наследования никак не связано с тем что все классы неявно наследуся от System.Object. В нем нет никаких данных так что и проблем с этим не былоб.
Posted via RSDN NNTP Server 1.9
WBR, Igor Evgrafov
Re[3]: В чём смыл ограничения в наследовании в C#?
От: _FRED_ Черногория
Дата: 13.06.05 15:46
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>Отсутствие множественного наследования никак не связано с тем что все классы неявно наследуся от System.Object. В нем нет никаких данных так что и проблем с этим не былоб.


А как же тогда вызываются виртуальные методы, как происходит lock(syncRoot)?
under «*none*»,
... << RSDN@Home 1.1.4 beta 7 rev. 468>>
Help will always be given at Hogwarts to those who ask for it.
Re[3]: В чём смыл ограничения в наследовании в C#?
От: mihailik Украина  
Дата: 13.06.05 16:37
Оценка:
> 1 или 2 смотря как наследуются, virtual или обычно.

Мм.. Это был ответ, а не вопрос

Я намекаю на то, что дополнительное разделение
виртуального/невиртуального наследования картину совсем не упрощает.


> M>Платформы типа .NET предназначены для упрощения труда и увеличения

> продуктивности. Множественное наследование сильно мешает достижению этих
> целей.
>
> Как множественное наследование мешает увеличению продуктивности я не
> понял. ИМХО наоборот

Ну, если на пальцах, то с деревом куда легче работать, чем с графом. А
ещё если добавить виртуальное/невиртуальное наследование — совсем
сложно. В голове не удержать

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


> мне пришлось унаследоваться от Component и оборачивать ArrayList


ArrayList действительно лучше оборачивать, наследовать от него публичные
объекты опасно. Это частности. А если бы там был другой класс, можно
было бы не наследоваться от Component, а реализовывать IComponent — там
работы на пять строк.

Но я понял, о чём ты. Конечно, за упрощение архитектуры приходится
доплачивать. Но в целом упрощение архитектуры важнее.


> Думаю всё таки причины чисто человеческие


Именно так.
Разработчики дотнета посчитали, что множественное наследование в общем
случае не подходит для построения понятных и предсказуемых архитектур.

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

Реализация в компиляторах тоже важная причина, но простота самой модели
древовидного наследования — это самое главное.


> Во-первых, сама идея общедоступности библиотеки, которую уже давно


Не совсем понял, при чём здесь MFC. .NET Framework не использует MFC ни
в каком виде. Это полностью отдельные проекты.

Ми.
Posted via RSDN NNTP Server 1.9
Re[4]: В чём смыл ограничения в наследовании в C#?
От: adontz Грузия http://adontz.wordpress.com/
Дата: 13.06.05 17:32
Оценка:
Здравствуйте, mihailik, Вы писали:

M>Но я понял, о чём ты. Конечно, за упрощение архитектуры приходится доплачивать.


Copy-Paste'ом

M>Но в целом упрощение архитектуры важнее.


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

M>Не совсем понял, при чём здесь MFC. .NET Framework не использует MFC ни в каком виде. Это полностью отдельные проекты.


Просто аналогия. Что понять .Net нет необходимости понимтаь множественное наследование.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[5]: В чём смыл ограничения в наследовании в C#?
От: mihailik Украина  
Дата: 13.06.05 20:33
Оценка:
M>>Но в целом упрощение архитектуры важнее.

A>В целом нет. В целом надо сохратить объём работы кодера, а архитектурой всё равно занимается квалифицированный человек.


К сожалению, трудно оспорить — начинается область интуиции.

Мой опыт подсказывает, что Микрософт часто выдумывает унылые причины, которые потом оказываются очень верными.
Re[3]: В чём смыл ограничения в наследовании в C#?
От: Tom Россия http://www.RSDN.ru
Дата: 16.06.05 07:45
Оценка:
GIV>Отсутствие множественного наследования никак не связано с тем что все классы неявно наследуся от System.Object. В нем нет никаких данных так что и проблем с этим не былоб.

Отсуствие множ. наследование связанно именно с System.Object.
Кстате тоже было и в Delphi, так, что это не я выдумал.

К примеру

class Foo : Bar1, Bar2
{
}
..
..
..

Foo foo = new Foo();
foo.GetHashCode() // невозможно определить какую именно GetHashCode необходимо вызывать
Народная мудрось
всем все никому ничего(с).
Re[4]: В чём смыл ограничения в наследовании в C#?
От: GarryIV  
Дата: 16.06.05 21:03
Оценка:
Hello, Tom!

GIV>> Отсутствие множественного наследования никак не связано с тем что все

GIV>> классы неявно наследуся от System.Object. В нем нет никаких данных
GIV>> так что и проблем с этим не былоб.

T> Отсуствие множ. наследование связанно именно с System.Object.

T> Кстате тоже было и в Delphi, так, что это не я выдумал.

T> К примеру


T>
 T> class Foo : Bar1, Bar2
 T> {
          using Bar1.GetHashCode; // теперь возможно...
 T> }
 T> Foo foo = new Foo();
 T> foo.GetHashCode() // невозможно определить какую именно GetHashCode
 T> необходимо вызывать


Почему невозможно? В языках допускающих множественное наследование это как раз не проблема

#include <iostream>

// Типа наш любимый System.Object
struct Object
{
 virtual int GetHashCode(){return 0;};
};

struct Bar1: virtual Object{};

struct Bar2: virtual Object{};

struct Foo : Bar1, Bar2{};

int main(int argc, char* argv[])
{
 Foo * f = new Foo();
 std::cout << f->GetHashCode(); // все работает
 delete f;
}


Главное чтоб подобъект Object был всегда только в одном экзкмпляре тогда сомнений какую функцию звать не будет. Непреодолимых проблем с этим я не вижу...
Posted via RSDN NNTP Server 1.9
WBR, Igor Evgrafov
Re[5]: В чём смыл ограничения в наследовании в C#?
От: adontz Грузия http://adontz.wordpress.com/
Дата: 16.06.05 21:17
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>Почему невозможно? В языках допускающих множественное наследование это как раз не проблема


struct Bar1: virtual Object{};
struct Bar2: virtual Object{};
struct Foo : Bar1, Bar2{};


А с другой стороны, делать все наследования виртуальными тоже не дело. Сторонние эффекты, от того что несколько наследников используют один и тот же базовый класс могут быть те ещё.
Тогда уже надо вводить два типа наследования, а это чревато ошибками понимания (если вообще будет хоть какое-то понимание того что происходит)
Об этом и писали по ссылкам которые я приводил.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[6]: В чём смыл ограничения в наследовании в C#?
От: GarryIV  
Дата: 16.06.05 22:37
Оценка:
Здравствуйте, adontz, Вы писали:

GIV>>Почему невозможно? В языках допускающих множественное наследование это как раз не проблема


A>
A>struct Bar1: virtual Object{};
A>struct Bar2: virtual Object{};
A>struct Foo : Bar1, Bar2{};
A>


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

A>Тогда уже надо вводить два типа наследования, а это чревато ошибками понимания (если вообще будет хоть какое-то понимание того что происходит)
A>Об этом и писали по ссылкам которые я приводил.

С этим я совершенно согласен. Есть общий предок Object или его нет все проблемы связанные с множественным наследованием остаются на месте (и по мнению разработчиков дотнета не стоят выгод которые оно дает).

Я только говорил, что не вижу причин по которым именно System.Object мешает реализовать множественное наследование. Именно от System.Object сторонних эффектов не будет как бы его не использовали наследники. ИМХО достаточно написать в спецификации, что для объекта любого класса как бы он не наследовался подобъект System.Object будет только один. Для этого даже не надо явно вводить два типа наследования...
WBR, Igor Evgrafov
Re: В чём смыл ограничения в наследовании в C#?
От: DuШes  
Дата: 17.06.05 08:07
Оценка:
Здравствуйте, adontz, Вы писали:

A>Не нашёл ответа, но жутко интересно


A>В чём смысл, что нельзя отнаследоваться от нескольких классов, но можно от одного класса и нескольких интерфейсов?

A>Соответсвенно ключевое слово base для вызова конструктора базового типа не оставляет и надежды, что не абстрактных базовых типов может быть два.

A>В Си++ такого ограничения нет и я нигде не встречал критики по этому поводу.


A>Объясните пожалуйста


много уже сказали...лично я воспринимаю классы .net как логическое их развитие из коклассов технологии COM (моя точка зрения основывается хотя бы на том, что к .NET свою руку приложил сам Д.Бокс ) — а в COM нет множественного наследования, да и вообще нет наследования от кокласса, зато есть наследование от интерфейсов, хотя , если потребуется, такое можно обойти или делегированием или агрегированием...
Re[4]: В чём смыл ограничения в наследовании в C#?
От: _FRED_ Черногория
Дата: 17.06.05 09:12
Оценка:
Здравствуйте, Tom, Вы писали:

GIV>>Отсутствие множественного наследования никак не связано с тем что все классы неявно наследуся от System.Object. В нем нет никаких данных так что и проблем с этим не былоб.


Tom>Отсуствие множ. наследование связанно именно с System.Object.

Tom>Кстате тоже было и в Delphi, так, что это не я выдумал.

Tom>К примеру


Tom>class Foo : Bar1, Bar2
Tom>{
      using Bar1.GetHashCode; // Может, по аналогии?
Tom>}
Tom>..
Tom>..
Tom>..

Tom>Foo foo = new Foo();
Tom>foo.GetHashCode() // невозможно определить какую именно GetHashCode необходимо вызывать
<< RSDN@Home 1.1.4 beta 7 rev. 474 >> =01:19= [Windows XP — 5.1.2600.0]
under «*none*»
Help will always be given at Hogwarts to those who ask for it.
Re[5]: В чём смыл ограничения в наследовании в C#?
От: GarryIV  
Дата: 17.06.05 20:38
Оценка:
Hello, _FRED_!

F>
 Tom>> class Foo : Bar1, Bar2
 Tom>> {
 F>       using Bar1.GetHashCode; // Может, по аналогии?
 Tom>> }

 F>


Вот с таким подходом грабель точно будет достаточно... Да и каждый раз писать using на все методы system.object занятие малоприятное.
Posted via RSDN NNTP Server 1.9
WBR, Igor Evgrafov
Re[2]: В чём смыл ограничения в наследовании в C#?
От: GarryIV  
Дата: 17.06.05 21:46
Оценка:
Hello, vdimas!

v> Как мне кажется, основная проблема — техническая. (остальные объяснения

v> про неявную сложность — отмазки )

v> А техническая проблема заключается в реализации сборщика мусора, для

v> коего единица сбора — это Object.

v> Если объект множественно наследован, т.е. инкапсулировал в свое тело

v> несколько Object,

Вот тут вот ни назу не "т.е". Зачем нужно несколько Object? Хоть одну причину назови...
Posted via RSDN NNTP Server 1.9
WBR, Igor Evgrafov
Re[6]: В чём смыл ограничения в наследовании в C#?
От: Lloyd Россия  
Дата: 18.06.05 14:54
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>Вот с таким подходом грабель точно будет достаточно... Да и каждый раз писать using на все методы system.object занятие малоприятное.


using Bar1.* ?
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Re[7]: В чём смыл ограничения в наследовании в C#?
От: _FRED_ Черногория
Дата: 18.06.05 15:42
Оценка:
Здравствуйте, Lloyd, Вы писали:

GIV>>Вот с таким подходом грабель точно будет достаточно... Да и каждый раз писать using на все методы system.object занятие малоприятное.


L>using Bar1.* ?


Неее, это уже ява получится...
Help will always be given at Hogwarts to those who ask for it.
Re[7]: В чём смыл ограничения в наследовании в C#?
От: Sinclair Россия https://github.com/evilguest/
Дата: 20.06.05 07:26
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>Я только говорил, что не вижу причин по которым именно System.Object мешает реализовать множественное наследование. Именно от System.Object сторонних эффектов не будет как бы его не использовали наследники. ИМХО достаточно написать в спецификации, что для объекта любого класса как бы он не наследовался подобъект System.Object будет только один. Для этого даже не надо явно вводить два типа наследования...

Лично я подозреваю, что собака порылась во взаимодействии с GC. Не секрет, что указатели на объекты "множественных" типов начинают вести себя довольно-таки нетривиально при приведениях (по крайней мере, в С++). Возможно, сложности с получением графа достижимости в MI-системах и привели к отказу от поддержки MI вообще.
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re: Main stream object model
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 20.06.05 08:20
Оценка:
Здравствуйте, adontz, Вы писали:

A> В чём смыл ограничения в наследовании в C#?

A> Не нашёл ответа, но жутко интересно

Такова main stream объектная модель. Попробуйте только добавить множественное наследование в С# и Вы тот час же получите аналогичные С++ сонмища правил, исключений из правил и т.д. Main stream объектная модель пригодна только для обычного простого наследования, точнее будет сказать — для расширения типов. Это не значит что она плохая. Она оптимальна для модели расширения существующих типов, но дело в том, что расширять можно только один тип — а это как раз и есть "одиночное" наследование.

Грамотно спроектированной объектной моделью, органично включающей в себя то что принято называть множественным наследованием, является, например, объектная модель реализованная в языке программирования Zonnon. Она не является main stream объектной моделью — не оперирует понятием расширения типов, а оперирует понятием пересмотра определений (refine definition).

P. S.
Вся существующая критика множественного наследования на самом деле является не критикой множественного наследования самого по себе, а лишь только критикой реализации множественного наследования в "main stream" объектной модели, в частности ее реализации в С++. В самом по себе множественном наследовании, вообще-то, ни чего страшного нет, только не надо его понимать так как это сделано в С++.
Re[2]: +
От: Сергей Губанов Россия http://sergey-gubanov.livejournal.com/
Дата: 20.06.05 08:33
Оценка:
СГ>P. S.
СГ>Вся существующая критика множественного наследования на самом деле является не критикой множественного наследования самого по себе, а лишь только критикой реализации множественного наследования в "main stream" объектной модели, в частности ее реализации в С++. В самом по себе множественном наследовании, вообще-то, ни чего страшного нет, только не надо его понимать так как это сделано в С++.

В догонку...
Далеко за примерами ходить не надо. В этой же ветке как раз идет критика якобы множественного наследования; предлагаются варианты с проблемами в сборщике мусора, проблемы с единым предком, рассматриваются "указатели на базы объекта" и т.д. и т.п. НО!!! всё это лишь критика попытки реализации множественного наследования как раз в рамках стандартной объектной модели. Конечно, очевидно, что в рамках main stream объектной модели множественное наследование очень сложное и запутанное явление, ведь оно ей не присуще по рождению. Но это не значит что идея того что обозначает термин "множественное наследование" сама по себе глупа. Просто нужна совершенно другая объектная модель!
Re[2]: В чём смыл ограничения в наследовании в C#?
От: Adadurov  
Дата: 24.06.05 16:09
Оценка:
V>Все-таки, множественное наследование как раз-таки дает бОльшую продуктивность при реализации сложных иерархий.

При реализации сложных иерархий начинают очень сильно проявляться сторонние эффекты!!!!
И в этом случае на тестирование и разруливание этих самых сторонних эффектов тратится сил гораздо больше чем на
реализацию Mixin-класса.
Это мое мнение, выстраданное не в одном проекте на C++.

С уважением,
Алексей Ададуров.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.