2008-11-28 121 views
1

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

他其实带来了以下主题:一个新的人是从哪里继承的?

我的理解是,将会有一个人类,新的遗传将从该类继承,并从他的父母那里获得一些实例变量(例如他的DNA和其他)。

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

现在我有点困惑,因为老实说...继承对象?继承是否用于继承包含某些对象组所共有的方法的类?这个说法让我感到困惑不已。

+0

我喜欢在现实生活中编程。 – Gopoi 2011-03-29 04:24:53

回答

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 { ... } 

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

+1

你是对的,亲子关系绝对不是遗传。那是因为一个类不是从一个类的实例继承的,而是从类本身继承的。 – Loki 2009-01-03 00:56:37

0

我想父母也是人。所以父母是人类的财产。它与OOP继承无关。它可能会这样做,如果你指的是人类的种类,如高加索人类延伸人类

3

你们都错了......孩子和父母都是人类的例子...。例如,在一个可能的类结构中,HumanBeing(所有它们)全部继承自继承自“Animal”的“Mammal”的“Primate”...

人类继承了灵长类动物的所有行为,如“ WalkUpright()“等
灵长类继承哺乳动物所有行为,如‘乳酸()’,”活产(),等等哺乳动物继承动物行为...

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

并且可能还有另一个名为Children的属性,其中包含HumanBe实例的集合ing objects ...

+0

这是我的论点:新的孩子是人类的实例化对象它接收一些DNA和方法的类和学习,因为它去了。他坚持认为,如果孩子从父母那里继承,这种父母会继承他们的父母,那么这样做会更好。 – neohaven 2008-11-28 15:56:32

+0

我想你是“重载”单词“继承”。你的陈述“新的存在将'从该类继承并获得一些实例变量......”意味着你认为他的孩子是一个从父类继承的单独的类。你不能为每代。 – 2008-11-28 16:08:25

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

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

总之,当你想到类继承时,不要考虑人类继承。它几乎肯定不会有帮助。

1

人类将是一个阶级,所有的人类都属于同一个阶级。

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

父亲和母亲都只是工厂(该人本身的复合材料),我们可以从"missing link"继承虽然

,这取决于域。

但是你的朋友有一个观点,例如阿基里斯从一个女神和一个人继承,因此证明了多重继承。

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

0

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

你的朋友的概念更接近于“基于原型的OO语言(例如Self和Javascript)”中的“对象继承”。你更符合Smalltalk,Java和C++的典型“类继承”。 Java的(特别是最近)倾向于将继承看作是所有关于管理类型的东西,并且现在促使“组合”而不是继承以实现代码重用,这部分是因为Java中的继承不如组合,因此“偏好合成”是很好的做法。部分原因是“脆弱的基础级问题”。

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