这个标题似乎有些奇怪,初学者可能会无法理解。
先来看看面向对象中组合和继承的基本概念:
组合——在某个类中定义了另一个类的实例,对其进行数据维护和操作。
继承——某个类从另一个类继承,则自动“拥有”了父类的的数据和方法。
可见,在本质上两者是有很大的共性的,就是利用另一个类已有的数据和方法。
看看下面的例子——
首先,我们来定义一个常见的类Point。
- public class Point
- {
- public float x;
- public float y;
- public Point(float x, float y)
- {
- this.x = x;
- this.y = y;
- }
- public void MoveTo(float x, float y)
- {
- this.x = x;
- this.y = y;
- }
- public void Move(float dx, float dy)
- {
- this.x += dx;
- this.y += dy;
- }
- }
接着我们用组合和继承来分别定义Circle类。
- // 组合
- public class Circle
- {
- public Point Center;
- public float Radius;
- public Circle(Point center, float radius)
- {
- this.Center = center;
- this.Radius = radius;
- }
- public void MoveTo(Point center)
- {
- this.Center = center;
- }
- }
- // 继承
- public class Circle : Point
- {
- public float Radius;
- public Circle(Point center)
- {
- this.x = center.x;
- this.y = center.y;
- }
- public Point Center
- {
- get { return this; }
- set { this.x = value.x; this.y = value.y; }
- }
- }
从使用者的角度来看,组合更加接近“逻辑”,这是很明显的。但是,对于复杂的应用,可能找不到明显的“逻辑”,这个时候可以采用下面的两个原则来判断:
1、如果一个类可以直接应用另一个类中绝大多数的方法,可以考虑用继承减少代码量
2、如果继承后给使用者带来额外的麻烦(比如部分函数的继承容易引发异常),建议用组合方式