2011-11-08 150 views
0
class B extends A 

这段代码B类可以使用变量和类A的方法继承和组成之间的区别?

class B 
{ 
    A a=new A(); 
} 

现在,我们还可以用在B级变量和类的方法的使用对象

所以我问题是这样的----为什么我们用这两种不同的方式来使用其他类的属性(根据变量和方法)..

+2

没有时间获得完整答案,但您要找的是[继承vs构图](https://www.google.com/search?q=inheritance+vs+composition)。另请参阅[继承和组合之间的区别](http://stackoverflow.com/questions/2399544/difference-between-inheritance-and-composition)。 –

回答

1

我觉得B类扩展A介绍某种类,你可以使用A的方法,B中的变量,即使你不知道A;而且它是在面向对象的设计方面更加美丽。

+1

**美丽**绝对不是一个有效的说法,并且可能是客观的。它还引入了许多额外的问题,正确的设计。 – ZenMaster

+0

“如果你不知道A”的意思是什么。你可以解释一下 – SilentBomb

+0

A < - B < - C,你可以在C中使用A和B的所有方法,你不需要知道哪个方法在A中,哪个方法在B中,并且相应地调用它们。 –

4

第二种方法称为代表团。还有组合物 - 当AB成员。

两者之间的区别是,如果A是不是在同一个包B(包访问是一个不同的情况下 - 留给读者做练习) - 然后在代表团组成的情况下你会只能访问公共数据成员和类别A的方法,而在继承的情况下,继承类B将有权访问公共和受保护的成员和类A的方法。

更新

有很多即使在的A所有方法和成员都B访问的情况下(其中大部分涉及这样的情况:你是不是这两个类的所有者的其他差异,而是当第三方向您提供A,而您无法控制其访问修饰符时)。

但即使您确实有控制权并且可以将A的所有成员和方法定义为public - 您想要吗?这将引入额外的维护问题部落 - 最重要的,IMO,是什么定义为公共是你和你的代码的用户之间的合同 - 也许有人在地球的不同部分。这反过来又意味着你无法从他身上隐藏实现细节,您的私人实用方法或任何东西 - 没有什么能够阻止他使用的一些方法,你只对一些内部计算写道,直接。

这也就意味着 - 明天,当你决定,你不希望再次或维持这种方法它引入某种性能或安全性问题的 - 你无法将其删除。 有人已经使用它。

另一个更新

如下文所述,有什么东西,我没有在继承的情况下,你还收到了“免费赠送”中提到, - 多态性See here.

+0

我喜欢你解释的方式,但是对于同样的事情,这两种方式的结果都是一样的。但是如果A类和B类都在同一个包中并声明为public,那么将会有什么区别。\ – SilentBomb

+0

要继承您也可以在使用A型的任何地方使用B型。在所示的第二个示例中,即使它包含A类型的对象,但它不能用于对象A可用于的所有对象,这会违背继承的目的。 – Toast

1

一个明显的区别是压倒一切的A级定义的函数

想象一下,你有一个定义的10种功能,并要覆盖只是其中之一。然后,如果你使用继承,你只覆盖那个继承,并且仍然可以调用全部10.使用另一种方法,除非你重新实现它们,否则你不能调用任何继承。 (或者让a公开并直接调用它,但这是违反封装的)。

1

第一个例子是继承,而第二个例子是组合。

当B是比A更特殊的实体时,继承最好代表“是”的关系。例如,汽车是一种交通工具。继承为您提供超级类的所有公共和受保护的方法和变量。因此,子类应该对每个继承特征进行逻辑实现。例如,车辆可以具有颜色,因此所有车辆也必须具有颜色。

当A是B的子组件时,组合最能代表“有”关系。例如,一辆汽车有一个引擎。它们不是真正的另一个超集,它们是完全不同的类。但汽车必须使用发动机来执行。他们不太可能会分享许多方法和变量,所以继承会很尴尬。想象一下,汽车类必须实施或揭露许多具体引擎细节的方法,例如油位和温度。汽车对象不应该公开所有这些方法来简单地... drive()。

1

第一个示例是is-a关系的示例。 class B将是class A的扩展,并且包含所有class A的公共成员,并且也可以访问受保护的成员(在第二个示例中,您不会这样做)。这也允许您将源自class A的对象组合在一起(包括class A的类型),使用任何重写方法启用多态。这是第二个例子不允许你做的另一件事,请覆盖class A中定义的方法,以使它们更适合于class B。如果你想继承从一个类的行为,你会这样做。

第二个例子是has-a的关系。例如,在您可能有class Parent,其中具有一个class Child的情况下,您可以使用它。

有很多书籍/指南/文档可以为您提供每个选项的差异和优势,并且最适合特定场景。

编辑:我花了太长时间发布,如果你搜索“是 - 一个”和“有一个”的关系,你会发现很多信息。