В чём смыл ограничения в наследовании в 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: В чём смыл ограничения в наследовании в 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#?
От: Igor Trofimov  
Дата: 13.06.05 10:28
Оценка: +1
A>В Си++ такого ограничения нет и я нигде не встречал критики по этому поводу.

Очень странно, что не встречал. В описании любого языка, где ограничились именно такой схемой — наследование одной реализации и нескольких интерфейсов — Java, Delphi, теперь вот и 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: В чём смыл ограничения в наследовании в C#?
От: Аноним  
Дата: 13.06.05 12:40
Оценка: :))
>Очень странно, что не встречал.
Ничего странного, ведь речь идет о MS Visual C++, который поддерживает множественное наследование от нескольких классов. А Java, ... это немного другое. Поэтому, кто писал на MS Visual C++ и кажется это немного странным. Ничего страшного в этом нет, со временем привыкаешь.
С уважением, Александр. AlexKD Blog


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
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: В чём смыл ограничения в наследовании в 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[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: В чём смыл ограничения в наследовании в 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[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 нет множественного наследования, да и вообще нет наследования от кокласса, зато есть наследование от интерфейсов, хотя , если потребуется, такое можно обойти или делегированием или агрегированием...
В чём смыл ограничения в наследовании в 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
ссылка на оригинальное сообщение
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.