【问题标题】:Conception of inheritance in object-oriented languages面向对象语言中的继承概念
【发布时间】:2009-01-03 08:39:04
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 我喜欢将编程置于现实生活中。

标签: inheritance oop conceptual


【解决方案1】:

父母也是人类,属于哺乳动物家族。你的想法在我看来是最合乎逻辑的。

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

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

    // ...
}

当然我看不到:

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

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

【讨论】:

  • 你是对的,父子关系绝对不是继承。那是因为一个类不是继承自一个类的实例,而是继承自类本身。
  • 唯一的办法是,除非你所有的对象都是单例,但这只是愚蠢的。 (Alice 类、alice 实例、Bob 类、bob 实例、AliceAndBobChild 类、aliceAndBobChild 实例等)
【解决方案2】:

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

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

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

【讨论】:

  • 我希望其他人写了“这只是一个比喻,而不是一个很好的比喻”的答案,所以我不必:)
【解决方案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】:

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

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

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

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

    【讨论】:

    • 那是我的论点:新的孩子是类 Human 的实例化对象,它接收类的一些 DNA 和方法,并在运行过程中学习。他坚持认为,如果孩子从父母那里继承,效果会更好,而这些父母也会从他们的父母那里继承,依此类推。
    • 我猜你们都在“重载”“继承”这个词。您关于“新存在将从该类'继承'并获取一些实例变量......”的陈述暗示你认为他的孩子是一个从父类继承的单独类..你不能为每一代人。
    【解决方案5】:

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

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

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

    虽然我们可以从"missing link" 继承,但这取决于域。

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

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

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

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-25
            • 1970-01-01
            相关资源
            最近更新 更多