面向对象语言中的继承概念

时间:2008-11-28 15:44:56

标签: inheritance oop conceptual

我和我的一个朋友正在讨论多重继承与单继承,并且发现,我的面向对象设计的概念与他完全不同。我主要是一个Obj-C程序员,因此我不会每天使用多重继承。他主要是Windows / PSP下的C ++程序员,因此我们可能会在日常工作中使用不同的概念。

他实际上带来了以下主题:一个新的人类继承了什么?

我的观点是会有一个人类,新的存在会从该类继承并从他的父母那里获得一些实例变量(例如他的DNA和其他变量)。

他的观点是,孩子会继承他的两个父母,以获得他父母的方法。

现在我有点困惑,因为老实说......继承对象?是否继承用于从包含特定对象组共有方法的类继承?这个论点真的让我感到困惑。

8 个答案:

答案 0 :(得分:8)

为了正面比喻,新人从父母产生的一对受精卵中获得其特征,这些受精卵只是基于父母自己的DNA。

实际上,我认为这只是一个不好的比喻。仅仅因为“继承”是遗传学(或遗嘱和合同法)的借用术语,并不意味着它必须在概念上与软件开发1:1匹配,事实上它们只是表面上相似的概念。

例如,我父亲是律师,母亲是学校老师。我并非天生具有任何一种技能(行为,方法......)。

答案 1 :(得分:7)

父母也是人类,是哺乳动物生物家族的一部分。你的想法对我来说似乎最合乎逻辑。

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

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

    // ...
}

当然我看不到:

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

我看到母亲和父亲都参与了孩子的建设,这三个人都是人。

答案 2 :(得分:3)

你们都错了......孩子和父母都是人类的存在......例如,在一个可能的类结构中,HumanBeing(所有这些)都继承自“灵长类”,它继承自“动物”的“哺乳动物”......

人类继承灵长类动物的所有行为,如“WalkUpright()”等 Primate继承哺乳动物的所有行为,如“Lactate()”“LiveBirth()等......哺乳动物继承动物的行为......

每个HumanBeing实例都可以有两个名为Father和Mother的属性,它们都是HumanBeing的一个实例......

可能是另一个名为Children的属性,它包含HumanBeing对象实例的集合......

答案 3 :(得分:3)

同意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();
    }
}

答案 4 :(得分:1)

人类将成为一个阶级,所有人类都属于同一个阶级。

孩子,父亲和母亲只是那个阶级的例子。

母亲和父亲只是工厂(人类本身的复合体)

我们可能会继承"missing link",但这取决于域名。

但是你的朋友有一个观点,例如Achilles从一个Nymph和一个人类继承:S因此证明了多重继承。

超人继承了Kriptonian而Spiderman是一个实现蜘蛛的人! :P

答案 5 :(得分:0)

我认为父母也是人。所以父母是人类的财产。它与OOP继承无关。如果你指的是以种族为代表的人类类型,例如高加索延伸人类

,它可能会这样做

答案 6 :(得分:0)

在面向对象的行为方面,你朋友的观念是错误的。一个人不像父母一样继承父母的行为。一个人遗传基因 - 每个父母的一半 - 这些基因结合起来引起行为。例如,即使父母双方都有特定的眼睛颜色,孩子也不一定具有相同的眼睛颜色(如果你不接受高中生物学,就要查找隐性基因)。

简而言之,在考虑类继承时,不要考虑人类继承。它几乎肯定没有帮助。

答案 7 :(得分:0)

简短的回答是,你和你朋友的遗产概念都被许多人所持有并且同样合法。

你的朋友的概念更接近于“基于原型”的OO语言中的“对象继承”(例如Self和Javascript)。你的更符合“类继承”,这是Smalltalk,Java和C ++的典型特征。

Java(特别是最近)倾向于将继承视为管理类型的全部,现在敦促“组合”而不是继承以进行代码重用,这部分是因为Java中的继承不如组合灵活,因此“首选组合”是良好的做法。部分是因为“脆弱的基类问题”。

但如果你的朋友更习惯于创建“mixins”,他可能会更多地将继承视为一种库包含。这可能不是Java或C ++中的最佳实践,但它 是一种经常被理解的继承方式。