【发布时间】:2016-02-11 15:45:34
【问题描述】:
一个人有一个ID。 学生有学生证。 司机有驾照。
- 一个人上学并成为学生。
- 一个学生毕业,成为一个普通人。
- 一个人拿到驾照就成了司机。
- 一名学生获得驾照并成为一名司机。
这些东西只是像下面的例子那样改变状态吗:
class Person {
ID id;
StudentID stId;
DriverLicense license;
void drive() {
if(license == null) //illegal state exception
//drive
}
//bla bla
}
还是有继承?由于对象是数据+行为,新数据和能够做新事情应该保证一个新对象
class Student extends Person {
//
}
class Driver extends Person {
//
}
//things get messy here, in Java you can't extend multiple class
//what if there's a rule that, student drivers can request/get a tax reduction?
class DriverStudent extends Person, Driver {
//
}
另外,更重要的是,一个如何成为另一个?通过方法或构造函数或第三类(如服务或聚合)?
class Person {
Driver getADriversLicense() {
//create and return a Driver
//this person still exists but now there's a driver with this person's data
}
}
or:
class Driver extends Person {
public Driver(Person p) {
//constructor
}
}
or:
class Aggregate {
Driver giveDriversLicense(Person p) {
// access internal state of both objects(ditch encapsulation) and return a driver?
// put aggregate in same package with Driver and Person and use package private methods to provide encapsulation?
}
}
【问题讨论】:
-
继承才是正道。另一方面,在您的第二个问题中,第一种情况和第二种情况可能是兼容的:在
getADriversLicense内部调用new Driver(this)这是第二种情况的构造函数。 -
是否编译:
class DriverStudent extends Person, Driver {? -
你总是可以使用decorator pattern从一个类转换到另一个类。
-
@HovercraftFullOfEels 当然不会编译。但是,如果有一种方法需要一个既是学生又是司机的人呢?
-
@ctst:我很确定这是讽刺/假设......让 OP 思考。
标签: java oop domain-driven-design