我刚刚遇到短语"java subtype"和"true subtype".它在一个问题中以一种明确表明它们不相同的方式给出.但我无法找到两者之间有什么区别的解释.
有人可以解释"java子类型"和"真实子类型"之间的区别吗?
java子类型是扩展另一个类(甚至实现接口)的任何类.真正的子类型不是特定语言的:
真正的子类型总是可以替代超类型."超类型保证的任何财产必须由子类型(真正的子类型)保证"
http://www.cs.washington.edu/education/courses/cse331/10au/lectures/subtypingexamples.pdf
该链接包含一个非常有启发性的示例.假设您有一个存储值x和y的Point2D类.您现在可以创建一个子类型Point3D并添加一个值z.如果不覆盖任何方法并使用equals和hashcode方法,则可以随时用Point3D实例替换Point2D实例.
这当然是一个简单的例子.有人可能会争论为什么不只有Point3D.也许这些类都提供了一些方法,可以通过分成类来更好地被认为属于2D或3D领域.在这种情况下,它可能纯粹是一个设计决定.
class Point2D {
int x;
int y;
}
//true subtype
class Point3D extends Point2D {
int z;
}
Run Code Online (Sandbox Code Playgroud)
如果您使用Person类然后具有两个子类型(Employee和Customer),则可能会出现更复杂的示例.Employee和Customer都提供与Person相同的字段和方法.
class Person {
String name;
Date birthday;
@Override
public boolean equals(Object o){
//simplified equals implementation, this does not fulfill equals contract!
return name.equals(((Person)o).name);
}
}
//true subtype, same behaviour
class Employee extends Person {
long departmentId;
}
//not a true subtype, different behaviour -> equals
class Customer extends Person {
long customerId;
Date lastContact;
String city;
public boolean equals(Object o){
//simplified equals implementation, this does not fulfill equals contract!
return customerId.equals(((Customer)o).customerId);
}
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,Employee将是Person的真实子类型.但是,Customer不是真正的子类型,因为equals实现不同(并且可能也是hashCode())并且它的行为不会相同,并且可能无法始终替换Person对象.
| 归档时间: |
|
| 查看次数: |
5334 次 |
| 最近记录: |