[英]Java - Passing object into extended class
假设我有以下两个公共类:
椭圆类,它将获取width和height参数。
public class Oval extends Shape{
OvalClass oval;
public Oval(int width,int height){
oval = new OvalClass("first",10);
}
}
还有一个Shape类,它应该具有任何不同的形式(这就是我要扩展它的原因)。
public class Shape {
public void moveLeft(){
//object?
object.posX += 1;
}
}
编辑:
我们对GOval,其他类和move()方法了解不足,无法给出一个很好的答案。
将此其他OvalClass
视为椭圆类:
public class OvalClass {
String name;
int posX;
public OvalClass(String name, int posx){}
}
问题是,如何在Shape类中的椭圆形中创建object
椭圆形( GOval oval
)? 有没有更好的办法?
左右移动并非只有椭圆形或正方形才有。 每个形状都可以向左或向右移动。 因此,Shape应该包含以下功能:
public abstract class Shape {
int x;
int y;
public void moveLeft(){
this.x = x - 1;
}
...
abstract double getArea();
}
为了简洁起见,我省略了Shape的其他属性。 想象一下,它还具有上,下,右以及所有您希望所有形状都具有的形状。
现在,我们创建一个椭圆形。
public class Oval extends Shape {
int height;
int width;
public Oval(int height, int width, int x, int y) {
super(x, y);
this.height = height;
this.width = width;
}
public double getarea() { return Math.PI * width * height; }
}
请注意,我们不必告诉椭圆形如何左右移动。 因为它扩展了Shape,所以它已经知道如何左右移动。 实际上,我们可以告诉椭圆形像这样左右移动:
Oval o = new Oval(1, 1, 0, 0);
o.moveLeft();
中提琴! 即使我们没有在Oval类中定义一个名为moveLeft的方法,我们的Oval仍可以移动。 那就是继承的美妙之处moveLeft()
方法是由我们的Oval继承的。
尝试这样的事情:
public class Shape {
// Now all Shapes can move()
protected abstract void move(int x, int y);
public void moveLeft(){
//object?
move(-1,0);
}
}
public class Oval extends Shape {
private GOval oval;
public Oval(int width,int height) {
oval = new GOval(0,0,width,height);
}
// Implement move()
protected void move(int x, int y) {
oval.move(x, y);// or whatever method on GOval makes it move()
}
}
HTH
您是否在考虑重写超类moveLeft()?
public class Oval extends Shape{
GOval oval;
public Oval(int width,int height){
oval = new GOval(0,0,width,height);
}
@Override
public void moveLeft(){
if (oval != null)
oval.move(-1,0);
}
}
您可以使用参数化的类“ Shape<T>
”,该类具有名为“ GOval
”或其他任何几何形状的具体几何体。
考虑这堂课
public class Shape<T> {
T oval;
public void moveLeft(){
oval.move(-1,0);
}
}
及其处理程序
public class Oval extends Shape<GOval>{
public Oval(int width,int height){
oval = new GOval(0,0,width,height);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.