Каковы плюсы и минусы множественного наследования? - PullRequest
3 голосов
/ 20 апреля 2009

Каковы плюсы и минусы множественного наследования?

И почему у нас нет множественного наследования в C #?

UPDATE Итак, в настоящее время этого избегают из-за проблем с конфликтами, решающими, какой родительский метод вызывается и т. Д. Конечно, это проблема, которую должен решить программист. Или, может быть, это можно было бы решить одновременно как SQL, когда существует конфликт, требуется дополнительная информация, т. Е. Для разрешения конфликта в запросе может потребоваться ID.

Ответы [ 6 ]

6 голосов
/ 20 апреля 2009

Вот хорошее обсуждение ловушек множественного наследования:

Почему я должен избегать множественного наследования в C ++?

Вот обсуждение команды C #, почему они решили не разрешать множественное наследование:

3 голосов
/ 20 апреля 2009

Это просто еще один инструмент в наборе инструментов. Иногда это совершенно правильный инструмент. Если это так, то нужно найти обходной путь, потому что язык на самом деле запрещает это - боль и приводит к хорошим возможностям облажаться.

Плюсы и минусы можно найти только для конкретного случая. Я думаю, что на самом деле довольно редко можно решить проблему, но кто разработчики языка, чтобы решить, как мне решать конкретную проблему?

3 голосов
/ 20 апреля 2009

Я приведу здесь профессионала, основываясь на отчете C ++, который я конвертировал в REALbasic (который имеет интерфейсы, но только с одним наследованием).

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

К счастью, REALbasic имеет расширяет методы, которые похожи на методы расширения , недавно добавленные в C # в C # 3.0. Они немного помогают в решении проблемы, особенно потому, что их можно применять к массивам. Я все еще заканчивал тем, что некоторые иерархии классов стали глубже в результате свертывания в классах, которые ранее были множественно наследуемыми.

1 голос
/ 20 апреля 2009

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

В C # вы можете создать форму множественного наследования, включив экземпляры каждого родительского объекта в дочерний элемент.

class MyClass
{
    private class1 : Class1;
    private class2: Class2;

    public MyClass
    {
        class1 = new Class1;
        class2 = new Class2;
    }
    // Then, expose whatever functionality you need to from there.
}
0 голосов
/ 20 апреля 2009

Это одна из тех изюминок «помоги мне не выстрелить себе в ногу», как в Java.

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

0 голосов
/ 20 апреля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...