我和我的一个朋友正在讨论多重继承与单继承,并且发现,我的面向对象设计的概念与他完全不同。我主要是一个Obj-C程序员,因此我不会每天使用多重继承。他主要是Windows / PSP下的C ++程序员,因此我们可能会在日常工作中使用不同的概念。
他实际上带来了以下主题:一个新的人类继承了什么?
我的观点是会有一个人类,新的存在会从该类继承并从他的父母那里获得一些实例变量(例如他的DNA和其他变量)。
他的观点是,孩子会继承他的两个父母,以获得他父母的方法。
现在我有点困惑,因为老实说......继承对象?是否继承用于从包含特定对象组共有方法的类继承?这个论点真的让我感到困惑。
答案 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 ++中的最佳实践,但它 是一种经常被理解的继承方式。