1

我正在和我的一个朋友讨论多重继承与单继承,并发现很明显,我对面向对象设计的概念与他的完全不同。我主要是一名 Obj-C 程序员,所以多重继承并不是我每天都在使用的东西。他主要是 Windows/PSP 下的 C++ 程序员,所以我们可能每天使用不同的概念。

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

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

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

现在我有点困惑,因为老实说......从对象继承?继承不是用来从包含特定对象组通用方法的类继承的吗?这个论点真让我困惑不已。

4

8 回答 8

7

正面进行类比,新人类的特征来自父母产生的一对受精卵,这些受精卵只是松散地基于父母自己的DNA。

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

例如,我的父亲是一名律师,而我的母亲是一名学校教师。我不是天生就具备任何一种技能(行为、方法……)。

于 2008-11-28T15:49:57.297 回答
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 { ... }

我认为母亲和父亲相当参与他们孩子的建设,这三个人都是人类。

于 2008-11-28T15:53:37.180 回答
4

同意 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();
    }
}
于 2008-11-28T16:00:01.787 回答
3

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

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

HumanBeing 的每个实例都可以有两个属性,分别称为父亲和母亲,它们都是 HumanBeing 的实例......

也许还有另一个名为 Children 的属性,它包含 HumanBeing 对象实例的集合......

于 2008-11-28T15:50:21.713 回答
1

一个人就是一个类,所有的人都属于同一个类。

孩子、父亲和母亲只是该类的实例。

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

不过,我们可以从“缺失的链接”继承,这取决于域。

但是您的朋友有一点,例如阿喀琉斯从若虫和人类继承:S,因此证明了多重继承。

超人继承了克里普顿,而蜘蛛侠是实现蜘蛛的人类!:P

于 2008-11-28T20:17:18.913 回答
0

好吧,我认为父母也是人。所以父母是人类的财产。它与 OOP 继承无关。如果您指的是由种族代表的人类类型,例如高加索人扩展人类,它可能会这样做

于 2008-11-28T15:50:01.433 回答
0

就面向对象的行为而言,您朋友的概念是错误的。一个人不会像班级那样从父母那里继承行为。一个人从每个父母那里继承一半的基因,这些基因结合起来导致行为。例如,即使父母双方都有特定的眼睛颜色,孩子也不一定有相同的眼睛颜色(如果你没有学过高中生物,请查找隐性基因)。

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

于 2008-11-28T16:04:09.187 回答
0

简短的回答是,你和你朋友的继承概念已经被许多人所持有,并且同样是合法的。

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

Java(尤其是最近)倾向于将继承视为管理类型,现在敦促“组合”而不是继承以实现代码重用,部分原因是 Java 中的继承不如组合灵活,因此“优先组合”是一种很好的做法。部分原因是“脆弱的基类问题”。

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

于 2009-01-03T00:39:04.857 回答