现在的位置: 首页 > 综合 > 正文

面向对象: 类之间关系

2013年10月15日 ⁄ 综合 ⁄ 共 2085字 ⁄ 字号 评论关闭

面向对象编程的基本特征,众所周知:

1. 封装性


2. 继承性


3. 多态性

当然,还会有人提出第四个特性:

4. 抽象性

呵呵,第四个特性包含两个意思,即行为抽象、数据抽象。

行为抽象:体现在类的方法上(包括抽象类以及接口)。

数据抽象:体现在类的属性上(包括抽象类以及接口)。

但是个人认为抽象性应该包含在封装性里面了,但是很多技术大牛说抽象性是一个单独的特性。

每个人思考问题的方式不一样,那么认知也会不一样。

好了,不计较这些琐碎的事情了,我们还是言归正传吧。

类之间的关系大致可以分为下面几种,刚才说过分类的方式有很多种,不要过分在意如何分类,把重点放到分的是什么,毕竟这不是考试。

1. 继承 Inherit


2. 依赖 Dependency


3. 关联 Association


4. 聚合 Aggregation


5. 组合 Composition


6. 实现 Implemention

下面分别针对这几种关系赘述,观点不一致的请明示,互相学习,谢谢!

继承 Inherit

有些书籍也叫做泛化(Generalization),不是泛型,要区别,呵呵。

继承很好理解,通俗地讲就是 A 是 B 的一种,表示为 is-a 关系。代码示例:

package mark.zhang;

/**
 * 基类
 * 
 * @author verymark
 * 
 */
public class Person {

}

package mark.zhang;

/**
 * 子類
 * 
 * @author verymark
 * 
 */
public class Teacher extends Person {

}

依赖 Dependency

表现形式为 A 依赖与 B,B 很可能就是一个方法的参数、局部变量或者是一个方法等。

二者是一种 use-a 的关系。示例:

package mark.zhang;

/**
 * 基类
 * 
 * @author verymark
 * 
 */
public class Person {
	Department dep;
	
	// 使用其方法
	public void makePlan() {
		dep.plan();
	}
	
	// 将其当做形参
	public void notifyManager(Department dep) {
		// ToDo
	}
}

类 A (Person)使用类 B (Department),二者构成依赖关系,很明显 Department 的 plan() 有所变化,Person 的 makePlan() 也会改变。

关联 Association

关联的类之间是一种 has-a 的关系。类与类之间的联接,它使一个类知道另一个类的属性和方法。

关联又可以分为单向关联、双向关联。

单向关联,指的是类 A 知道类 B 的存在,或者类 B 知道类 A 的存在。举个例子吧!

package mark.zhang;

/**
 * 基类
 * 
 * @author verymark
 * 
 */
public class Person {
	Department dep;
	
}

双向关联,指的是类 A 、类 B 均知道对方的存在。

package mark.zhang;

/**
 * 基类
 * 
 * @author verymark
 * 
 */
public class Person {
	Department dep;
}

package mark.zhang;

public class Department {
	
	Person manager;
}

可以看出单向关联易于维护。

聚合 Aggregation

聚合与组合其实都是关联关系的一种。但是由于他们很特殊,单独说说呗!

聚合表现一种整体与个体的关系,比如公司与员工之间、篮球队与队员之间的关系。

关联强调类之间的平等,而聚合往往是不平等的。

package mark.zhang;

public class BasketballTeam {
	
	TeamMember member;
	
	Basketball ball;
	
}

可见篮球队是有篮球和队员等组成的,这是一种聚合关系。

组合 Composition

组合也叫做合成,是一种比较强(强于聚合关系)的关联关系,他强调一种整体与部分的关系。比如说人与身体器官的关系。

package mark.zhang;

/**
 * 基类
 * 
 * @author verymark
 * 
 */
public class Person {
	Header header;
	
	Hander hander;
	
	Heart heart;
	
}

从这里我们也可以看出类之间除了继承还可以聚合或者组合,因为继承加强了类与类之间的耦合度,所以在做设计的时候可以考虑聚合或者组合。

实现 Implemention

这种关系指的是实现接口,一个类实现某个接口必须实现其提供的抽象方法。

在文章的最后跟大家分享一个话题:这是什么关系?

看实例代码:

package mark.zhang;

import java.util.ArrayList;

/**
 * 基类
 * 
 * @author verymark
 * 
 */
public class Person {
	
	public void save(Person contacs) {
		ArrayList<Person> myContacs = new ArrayList<Person>();
		myContacs.add(contacs);
	}
	
}

在 Person 类中 save 方法用于保存联系人的,其中形参就是 Person 对象,这体现一种什么关系?

有人说是一种反射,你觉得是吗?求解中!

抱歉!评论已关闭.