当前位置: 技术问答>java相关
对think in java中的问题
来源: 互联网 发布时间:2015-08-31
本文导语: 刚刚开始看,在下面的话中有点不明白: 若通过继承增添了一种新类型,如“三角形”,那么我们为“几何形状”新类型编写的代码会象在旧类型里一样良好地工作。所以说程序具备了“扩展能力”,具有“扩展性...
刚刚开始看,在下面的话中有点不明白:
若通过继承增添了一种新类型,如“三角形”,那么我们为“几何形状”新类型编写的代码会象在旧类型里一样良好地工作。所以说程序具备了“扩展能力”,具有“扩展性”。
以上面的例子为基础,假设我们用Java写了这样一个函数:
void doStuff(Shape s) {
s.erase();
// ...
s.draw();
}
这个函数可与任何“几何形状”(Shape)通信,所以完全独立于它要描绘(draw)和删除(erase)的任何特定类型的对象。如果我们在其他一些程序里使用doStuff()函数:
Circle c = new Circle();
Triangle t = new Triangle();
Line l = new Line();
doStuff(c);
doStuff(t);
doStuff(l);
那么对doStuff()的调用会自动良好地工作,无论对象的具体类型是什么。
这实际是一个非常有用的编程技巧。请考虑下面这行代码:
doStuff(c);
此时,一个Circle(圆)句柄传递给一个本来期待Shape(形状)句柄的函数。由于圆是一种几何形状,所以doStuff()能正确地进行处理。也就是说,凡是doStuff()能发给一个Shape的消息,Circle也能接收。
问,如上面提到的,shape和Circle、Triangle、Line这些是否需要建立程序上的逻辑关联,才能使doStuff产生反应?是否这种逻辑关联是程序系统自己认识,并不需要我去重新建立这种逻辑关联?
那如果程序系统已经设置了他们之间的逻辑关联的话,是否也就是说如果在常理上,两个事物是一种包含或继承的关系,都可以不用我在程序中另外设置他们之间的逻辑关联?如一个简单的例子车、船、飞机等是属于交通工具中的,那我在开始的程序中是否可以这样设置:void doStuff(vehicle s) {……};并在后面的程序代码中可以这样写
Circle c = new Car();
Triangle b = new Boat();
Line p = new Plane ();
doStuff(c);
doStuff(b);
doStuff(p);
这样doSutff()这个函数也能同所有的vehicle通信?
若通过继承增添了一种新类型,如“三角形”,那么我们为“几何形状”新类型编写的代码会象在旧类型里一样良好地工作。所以说程序具备了“扩展能力”,具有“扩展性”。
以上面的例子为基础,假设我们用Java写了这样一个函数:
void doStuff(Shape s) {
s.erase();
// ...
s.draw();
}
这个函数可与任何“几何形状”(Shape)通信,所以完全独立于它要描绘(draw)和删除(erase)的任何特定类型的对象。如果我们在其他一些程序里使用doStuff()函数:
Circle c = new Circle();
Triangle t = new Triangle();
Line l = new Line();
doStuff(c);
doStuff(t);
doStuff(l);
那么对doStuff()的调用会自动良好地工作,无论对象的具体类型是什么。
这实际是一个非常有用的编程技巧。请考虑下面这行代码:
doStuff(c);
此时,一个Circle(圆)句柄传递给一个本来期待Shape(形状)句柄的函数。由于圆是一种几何形状,所以doStuff()能正确地进行处理。也就是说,凡是doStuff()能发给一个Shape的消息,Circle也能接收。
问,如上面提到的,shape和Circle、Triangle、Line这些是否需要建立程序上的逻辑关联,才能使doStuff产生反应?是否这种逻辑关联是程序系统自己认识,并不需要我去重新建立这种逻辑关联?
那如果程序系统已经设置了他们之间的逻辑关联的话,是否也就是说如果在常理上,两个事物是一种包含或继承的关系,都可以不用我在程序中另外设置他们之间的逻辑关联?如一个简单的例子车、船、飞机等是属于交通工具中的,那我在开始的程序中是否可以这样设置:void doStuff(vehicle s) {……};并在后面的程序代码中可以这样写
Circle c = new Car();
Triangle b = new Boat();
Line p = new Plane ();
doStuff(c);
doStuff(b);
doStuff(p);
这样doSutff()这个函数也能同所有的vehicle通信?
|
这应该是继承中讲的吧?
实际上,可以这么说这个问题:可以把子类对象的句柄赋给超类的句柄变量。也就是说,可以用超类的句柄来引用一个子类的对象,但只能访问超类定义的那部分对象。
如果你后面说的Car、Boat、Plane等都是继承(extends)于超类vehicle的话,那么是可以像你那么用的。
是不是我越说越糊涂了?:)
实际上,可以这么说这个问题:可以把子类对象的句柄赋给超类的句柄变量。也就是说,可以用超类的句柄来引用一个子类的对象,但只能访问超类定义的那部分对象。
如果你后面说的Car、Boat、Plane等都是继承(extends)于超类vehicle的话,那么是可以像你那么用的。
是不是我越说越糊涂了?:)
|
的确是这样。
|
只要你这些交通工具extends vehicle就一切ok了