Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > .NET > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 20.10.2011, 14:58   #1
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
Печаль Множественное наследование в C#

Хотел при решении одной задачи создать несколько абстрактных классов и один основной - потомок всех абстрактных, но при компиляции получаю ошибку: "Класс "ConsoleApplication1.MyClass" не может иметь несколько базовых классов: "ConsoleApplication1.MyAbstract 2" и "MyAbstract1"". Начал читать подробно что это за чертовщина и как её можно обойти и обнаружил примерно следующую методику:
Код:
    abstract class MyAbstract1
    {
        public void Some()
        {
//некоторый код
        }
    }

    abstract class MyAbstract2:MyAbstract1
    {
        public void Some2()
        {
//некоторый код
        }
    }

    class My:My2
    {
    }
//не стал расписывать подробно классы и поля
Стало крайне интересно: если эту проблему можно решить так, то на кой ляд ограничение множественного наследования?
Ладно, в данной задаче помогла вышеописанная методика, но возьмем несколько другую задачу: реализовать класс Car(автомобиль), который является наследником классов Engine(двигатель), Carburetor(карбюратор), Wheel(колесо). Тут не получиться, к примеру сделать класс Carburetor наследником Engine, а Wheel унаследовать от Carburetor(будет логически неверна данная структура наследования, как понимаете)=>засовывать все поля и методы родительских классов в класс Car также не особо правильно(получиться своеобразная "каша", если это все вообразить), так что здесь без множественного наследования никак не обойтись, но оно недоступно в синтаксисе языка!!! Конечно можно наверняка и тут придумать и нагородить своеобразную иерархию, но в такой иерархии "без бутылки не разберешься", хотя в принципе ничего чрезмерно сверхъестественного в данной задаче не было поставлено, даже наоборот первоначально все было разделено и размещено в соответствующие классы, выделены спец.методы и т.д.
Возникали у кого-нибудь такие проблемы и если возникали, то каким образом их решали?
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 20.10.2011, 15:16   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,003
По умолчанию

Цитата:
но возьмем несколько другую задачу
Не верное проектирование задачи, даже банально по логике, машина не является наследником движка, карбюратора и колеса, она содержит(состоит из них) их.
Код:
class Car
{
    Engine engine;
    ...
}
ну или уж http://ru.wikipedia.org/wiki/Фасад_(...проектирования)
Цитата:
Стало крайне интересно: если эту проблему можно решить так, то на кой ляд ограничение множественного наследования?
А это не решение, он так и не даст объединить несколько классов.
Тут, по сути говоря, идет обычное наследование(с расширением как обычно)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 20.10.2011 в 15:19.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.10.2011, 15:29   #3
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
Не верное проектирование задачи, даже банально по логике, машина не является наследником движка, карбюратора и колеса, она содержит(состоит из них) их.
Код:
class Car
{
    Engine engine;
    ...
}
ну или уж http://ru.wikipedia.org/wiki/Фасад_(...проектирования)
А это не решение, он так и не даст объединить несколько классов.
Тут, по сути говоря, идет обычное наследование(с расширением как обычно)
В принципе, как я писал, приведенный пример с автомобилем является примером, возможно и несколько корявым, но все же просто примером. К тому же, в зависимости от постановки задачи может быть верен как метод "Фасад", так и приведенный мной метод. Более того, наверняка в реальном мире можно найти далеко ни одну, ни две и даже ни сто двадцать две вещи, описание которых в виде классов при программировании требует множественного наследования(не будем заниматься конкретным поиском таких вещей, допустим что они просто есть)!
Согласен, что применение множественного наследования может приводить к некоторым ошибкам(у классов-родителей одинаковое наименование некоторых методов, например), но это уже работа программиста "грамотно именовать методы, поля" и избегать таких проблем.
Позволю себе также привести ссылку на статью из WikiPedia, в которой говорится о том, что, например, в C++ имеется множественное наследование!
По-моему, множественное наследование очень хорошая и важная штука и почему её нет в C# - это большой вопрос.
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.

Последний раз редактировалось Mixim; 20.10.2011 в 15:34.
Mixim вне форума Ответить с цитированием
Старый 20.10.2011, 15:39   #4
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,557
По умолчанию

Mixim
Цитата:
По-моему, множественное наследование очень хорошая и важная штука и почему её нет в C# - это большой вопрос.
Ну во первых оно есть. Можно наследовать от двух классов, и неограниченного количества интерфейсов. При том даже если пользовательский класс ни от чего не наследовать, он всё равно неявно наследуется от библиотечного Object, то есть не наследовать нельзя.

Цитата:
не будем заниматься конкретным поиском таких вещей, допустим что они просто есть
А может пример?
the_deer_one вне форума Ответить с цитированием
Старый 20.10.2011, 15:53   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,003
По умолчанию

Цитата:
Позволю себе также привести ссылку на статью из WikiPedia, в которой говорится о том, что, например, в C++ имеется множественное наследование!
Я это знаю отлично, но там нет интерфейсов.
Цитата:
Можно наследовать от двух классов
может я чтото упустил, но предок же может быть только один?(а про интерфейсы это по сути реализация интерфейся, а не наследование)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 20.10.2011, 15:58   #6
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,557
По умолчанию

Пепел Феникса
Цитата:
Я это знаю отлично, но там нет интерфейсов.
А чисто абстрактные классы? Не почти то же самое?

Цитата:
может я чтото упустил, но предок же может быть только один?
Один явный, + насильственно object.

Цитата:
а про интерфейсы это по сути реализация интерфейся, а не наследование
Просто по разному называется одно и то же.
the_deer_one вне форума Ответить с цитированием
Старый 20.10.2011, 16:00   #7
Mixim
Форумчанин
 
Регистрация: 29.10.2009
Сообщений: 259
По умолчанию

Цитата:
Сообщение от the_deer_one Посмотреть сообщение
А может пример?
Вспомнил один пример из реальной жизни: есть такое животное, как Волкособ - гибрид волка и собаки=>при реализации класса Volkosob возможно потребуется наследование от классов Wolf и Dog. Наверняка это не единственный пример.
Цитата:
Сообщение от the_deer_one Посмотреть сообщение
Mixim
Ну во первых оно есть. Можно наследовать от двух классов, и неограниченного количества интерфейсов.
Наследование от двух классов - Это ты про Object и MyParentClass? Интерфейсы - хорошая штука, но в них нельзя написать код самого метода, только его наименование
Из всех классических книг, посвященных программированию, ненавижу всего одну - русский перевод книги Роберта Седжвика-"Фундаментальные алгоритмы C++". Предпочитаю читать её в оригинале.
Mixim вне форума Ответить с цитированием
Старый 20.10.2011, 16:06   #8
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,557
По умолчанию

Mixim
Цитата:
Вспомнил один пример из реальной жизни: есть такое животное, как Волкособ - гибрид волка и собаки=>при реализации класса Volkosob возможно потребуется наследование от классов Wolf и Dog.
Чёрд. Чё-то природа сделала плохое архитектурное решение.
the_deer_one вне форума Ответить с цитированием
Старый 20.10.2011, 16:10   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,003
По умолчанию

Цитата:
А чисто абстрактные классы? Не почти то же самое?
почти, но все-таки не интерфейс.
я это к тому что там при отсутствии интерфейсов, множественное наследование жизненно необходимо в итоге.(+мне не нравится как это потом работает, особенно если были виртуальные функции у классов)
Цитата:
Один явный, + насильственно object.
object лишь при отстутствии явного предка.(хотя по сути придирка к словам, но считаю что так более верно)
ибо если есть предок, то предок уже содержит object.
Цитата:
Просто по разному называется одно и то же.
в общем, да, но считаю что так более точно.
Цитата:
Вспомнил один пример из реальной жизни: есть такое животное, как Волкособ - гибрид волка и собаки=>при реализации класса Volkosob возможно потребуется наследование от классов Wolf и Dog. Наверняка это не единственный пример.
запросто опровергну пример, оно является на 100% и собакой и волком?(полностью, до мелочей)
помоему все-таки нет, тут помоему так и просится фасад, 40% собаки, 50% волка и 10% личного от смешения
да и про пересечение свойств, методов итогового класса молчу.
(хотя может и не очень удачно привел решение, ибо чтобы сказать эффективное решение, надо четко спроектировать класс+иерархию, я же просто образно сказал)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 20.10.2011 в 16:15.
Пепел Феникса вне форума Ответить с цитированием
Старый 23.10.2011, 04:08   #10
spamer
Software Developer
Старожил
 
Аватар для spamer
 
Регистрация: 19.12.2008
Сообщений: 2,074
По умолчанию

Цитата:
Цитата:
а про интерфейсы это по сути реализация интерфейся, а не наследование
Просто по разному называется одно и то же.
Хм...а вот и нет, просто это все же разные вещи, а не то что вы говорите "по разному называется", так что Феникс прав...

Цитата:
Цитата:
может я чтото упустил, но предок же может быть только один?
Один явный, + насильственно object.
А вот тут так же немного удивился...Ведь на самом деле это не будет являться множественным наследованием...Ибо предок будет все равно один...
__________NewClass
____________|
____________|
________ParentClass2
____________|
____________|
_______ParentClass1
____________|
____________|
_________Object

А вот множественное должно выглядеть как-то так:
_________NewClass
____________|
__________/___\
_________/_____\
ParentClass1__ParentClass2
________\______/
___________|
_________Object
Будь проще и люди к тебе потянутся

Последний раз редактировалось spamer; 23.10.2011 в 04:20.
spamer вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Множественное наследование С++ добрый_фей Помощь студентам 1 13.06.2011 14:31
Множественное наследование liza kalueva Общие вопросы C/C++ 2 10.03.2010 02:57
Конкурс на изощренность. Множественное наследование Парсифаль Общие вопросы C/C++ 4 09.02.2010 22:21
Завихрения множественного наследования. (Динамическое множественное наследование) Парсифаль Общие вопросы C/C++ 10 09.02.2010 16:45
Множественное наследование Crucian Общие вопросы Delphi 1 29.12.2008 15:26