导言
上一篇文章,学习了组合关系和聚合关系,这篇文章,将带领大家走进依赖关系和泛化关系。
依赖关系
依赖关系,实际上是一种使用关系
依赖关系(Dependency)是一种使用关系,特定事物的改变有可能会影响到使用该事物的其他事物,在表示一个事物使用另一个事物时使用的依赖关系。
注意: 依赖关系表现为函数中的参数(use a),是类与类之间的连接,表示一个类依赖于另一个类的定义,其中一个类的变化将影响另外一个类。
而不是作为成员变量,以成员变量作为类之间关系的关系,实则是关联关系。而依赖关系是以函数中的参数为类之间影响的因素。
在UML中,依赖关系用带箭头的虚线表示,由依赖的一方指向被依赖的一方。
体现
类A和类B存在依赖关系,则必满足下列三种情况:
- 类B以参数的形式传入类A的方法。
- 类B以局部变量的形式存在于类A的方法中。
- 类A调用类B的静态方法。
例子
驾驶员开车,在Driver类的drive()方法中将Car类型的对象car作为一个参数传递,以便在drive()方法中能调用car的move()方法,而且驾驶员的drive()方法依赖于车的move()方法,因此类Driver依赖于类Car。
图示关系
代码关系
public class Driver
{
public void drive(Car car)
{
car.move();
}
...
}
public class Car
{
public void move()
{
...
}
...
}
泛化关系
泛化关系(generalization),即继承关系,也称"is-a-kind-of"关系。
有一些类相似但不相同,它们有共同属性,也有不同属性。我们将共同属性抽象到一个泛化类,这个类就被称为超类。不同属性是特化类的性质,特化类也被称为子类。在子类和超类间存在Is a的关系。超类也被称为父类或祖先类。子类也被称为孩子类或者子孙类。
1.每一个子类继承了超类的性质,但可以对这些性质以不同方式进行扩展。
2.一个类的性质是其属性或操作。
3.继承允许对父类进行适配,来形成子类。
4.子类从超类继承了继承了属性和操作,也可以增加属性、增加操作或重定义操作。
5.每一个子类自身也可以成为超类,进一步特化形成其他子类。
在UML中,泛化关系以空心三角形来表示。
备注
继承最根本的作用是做扩展而来,还有一个作用则是复用。但是做复用以关联关系实现最好,最好不用继承实现。
例子
活期账户(Checking Accout)和储蓄账户(Savings Account)有一些共同属性,而其他属性是不同的。所有账户的共同属性——即“账户”(accountNum这里写代码片
ber)和“余额”(balance)——-作为超类“账户”(Account)的属性。储蓄账户特有的属性,例如产生的“利息”(interest)(在这个银行中,活期账户不产生任何利息),作为子类“储蓄账户”的属性。活期账户特有的属性,例如“最后存款金额”(lastDepositAccount),作为子类“活期账户”的属性。
“储蓄账户”Is a “账户”
“活期账户”Is a “账户”
图解
区分器,表明对象的哪个性质被泛化关系用来抽象的一种属性。
在上图中,上诉“账户”泛化中的区分器“账户类型”(accountType)区分了“活期账户”和“储蓄账户”。
区分器并不需要称为泛化类或特化类的一个属性。因此,它不是“账户”超类或两个子类的属性。
代码
public class Account {
private int accountNumber;
private double balance;
}
public class SavingsAccount extends Account {
private double interest;
}
public class CheckingAccount extends Account {
private double lastDepositAmount;
}
结语
我们本文讲解了类图中类与类之间的关系之泛化和依赖关系,下一个文章将讲解类图中最后一个类与类之间的关系—-实现。
本文介绍了泛化关系的和依赖关系的例子,希望看到的读者能学会~~~