Концепция наследования в объектно-ориентированных языках - PullRequest
1 голос
/ 28 ноября 2008

Я обсуждал множественное наследование и одиночное наследование с моим другом и обнаружил, что моя концепция объектно-ориентированного проектирования совершенно иная, чем у него. Я в основном программист на Obj-C, поэтому множественное наследование я не использую ежедневно. Он в основном программист на C ++ под Windows / PSP, поэтому мы, вероятно, ежедневно используем разные концепции.

Он на самом деле поднял следующую тему: От чего наследует новый человек?

Я имел в виду, что будет класс Человека, и новое существо будет наследовать от этого класса и получать некоторые переменные экземпляра (например, его ДНК и другие) от своих двух родителей.

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

А теперь я немного растерялся, потому что, если честно ... Наследование от объектов? Разве наследование не используется для наследования от классов, которые содержат методы, общие для определенной группы объектов? Этот аргумент действительно смутил меня без конца.

Ответы [ 8 ]

8 голосов
/ 28 ноября 2008

Чтобы провести аналогию, новый человек получает свои черты от пары зигот, сгенерированных родителями, которые основаны лишь на собственной ДНК родителей.

Реально, я думаю, что это просто плохая аналогия. Тот факт, что «наследование» является заимствованным термином из генетики (или завещаний и договорного права?), Не означает, что он должен концептуально сопоставлять 1: 1 с разработкой программного обеспечения, и на самом деле они являются лишь внешне схожими понятиями.

Например, мой отец - юрист, а мама - школьный учитель. Я не был рожден с навыками (поведением, методами ...) одного из них.

7 голосов
/ 28 ноября 2008

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

public class Human extends Mammal implements HunterGatherer, Speech, CognitiveThought {

    public Human(Human mother, Human father) {
        super(mother, father);
        // ...
    }

    // ...
}

Конечно, я не вижу:

public class Human extends Mother, Father { ... }

Я вижу, что мать и отец весьма вовлечены в конструирование своего ребенка, все трое - люди.

3 голосов
/ 28 ноября 2008

Согласитесь с JeeBee, у родителей есть строительная роль!

public Class HumanFactory(Human mother, Human father)
{
    public Human NewHuman()
    {
        while(!mother.IsPregnant)  // may loop infinitely in the infertile case
            father.Mate(mother)
        while(mother.IsPregnant)
            System.Threading.Sleep(1000); // may take some months, get comfortable
        return mother.DeliverBaby();
    }
}
3 голосов
/ 28 ноября 2008

Вы оба не правы ... И Ребенок, и родители являются примерами Человека .... Например, в одной возможной структуре класса HumanBeing (ВСЕ из них) все наследуются от "Primate", который наследуется от "Mammal", который наследуется от "Animal" ...

Человек Наследует все поведение Приматов, например "WalkUpright ()" и т. Д.
Примат Наследует все поведение млекопитающих, например, "Lactate ()", LiveBirth () и т. Д. ... Млекопитающее наследует поведение животных ...

Каждый экземпляр HumanBeing может иметь два свойства, называемых Отцом и Матерью, каждый из которых является экземпляром HumanBeing ...

и, возможно, другое свойство Children, которое содержит коллекцию экземпляров объектов HumanBeing ...

1 голос
/ 28 ноября 2008

Человек был бы классом, и все люди принадлежат к одному и тому же классу.

Ребенок, отец и мать - только примеры этого класса.

Мать и отец - всего лишь фабрики (составные части самого человека)

Мы можем наследовать от «недостающей ссылки» , хотя это зависит от домена.

Но у вашего друга есть точка, Ахиллес, например, наследует от нимфы и человека: S, следовательно, множественное наследование доказано.

Супермен наследует Криптониана, а Человек-Паук - человек, который реализует Паука! : P

0 голосов
/ 03 января 2009

Короткий ответ таков: концепция наследования как у вас, так и у вашего друга поддерживается многими людьми и одинаково легитимна.

Концепция вашего друга ближе к "наследованию объектов" в ОО-языках "на основе прототипов" (например, Self и Javascript). Ваш больше соответствует "наследованию классов", что типично для Smalltalk, Java и, да, C ++.

Java (особенно в последнее время) склонна рассматривать наследование как все об управлении типами и теперь призывает «состав» вместо наследования для повторного использования кода. Это отчасти потому, что наследование в Java менее гибкое, чем составление, поэтому «предпочтение композиции» хорошая практика. И частично из-за «хрупкой проблемы базового класса».

Но если ваш друг больше привык к созданию "миксинов", он вполне может видеть наследование больше как своего рода библиотеку. Возможно, это не лучшая практика в Java или C ++, но - это способ, которым наследование часто понимают.

0 голосов
/ 28 ноября 2008

С точки зрения объектно-ориентированного поведения концепция вашего друга неверна. Человек не наследует поведение от своих родителей так же, как класс. Человек наследует гены - половина от каждого родителя - и эти гены объединяются, чтобы вызвать поведение. Например, даже если оба родителя имеют определенный цвет глаз, ребенок не обязательно имеет один и тот же цвет глаз (посмотрите рецессивные гены, если вы не изучали биологию средней школы).

Короче говоря, не думайте о наследовании людей, когда вы думаете о наследовании классов. Это почти наверняка не поможет.

0 голосов
/ 28 ноября 2008

Ну, я думаю, что родители тоже люди. Так что родители это собственность человека. Это не имеет ничего общего с наследованием ООП. Это может произойти, если вы имеете в виду типы людей, представленные расой, например, Кавказ расширяет Человека

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