确定方法';在Java'中使用继承类的签名;s的抽象方法
我知道这是一个非常简单的问题,但我已经在Python中工作了相当长的时间,现在我必须回到Java,我似乎在改变芯片和思考Java的基本多态性方面遇到了问题 是否可以使用继承的类之一作为参数覆盖(准确地说是实现)Java中的类“确定方法';在Java'中使用继承类的签名;s的抽象方法,java,oop,inheritance,abstract,Java,Oop,Inheritance,Abstract,我知道这是一个非常简单的问题,但我已经在Python中工作了相当长的时间,现在我必须回到Java,我似乎在改变芯片和思考Java的基本多态性方面遇到了问题 是否可以使用继承的类之一作为参数覆盖(准确地说是实现)Java中的类“abstract方法 让我用一个非常简单的例子来解释(遵循“几乎正式”的形状) 有没有办法让Java将CircleDrawer类中的draw方法识别为ShapeDrawer中抽象draw的实现?(毕竟,圆类是从形状扩展而来的) 否则,我想说的是,CircleDrawer类的
abstract
方法
让我用一个非常简单的例子来解释(遵循“几乎正式”的形状)
有没有办法让Java将CircleDrawer
类中的draw
方法识别为ShapeDrawer
中抽象draw
的实现?(毕竟,圆
类是从形状
扩展而来的)
否则,我想说的是,CircleDrawer
类的draw
方法只接受Circle
类型的实例,但同时,我想告诉Java编译器,void draw(Circle c)
实际上是抽象方法抽象void draw(Shape s)的实现
位于其父类中
提前感谢您。您可以通过泛型解决您的问题:
public abstract class ShapeDrawer<T extends Shape> {
public abstract void draw(T shape);
}
public class CircleDrawer extends ShapeDrawer<Circle> {
public void draw(Circle circle) { ... }
}
公共抽象类ShapeDrawer{
公共抽象空图(T形);
}
公共类CircleDrawer扩展ShapeDrawer{
公共空白绘图(圆){…}
}
不,Java方法签名必须完全匹配,不能使用子类型,否则将重载方法而不是重写它
您可以返回子类型,但仅此而已,并且返回类型不是方法签名的一部分。您不能返回,这是一个很好的理由。拿这个声明来说
public abstract class ShapeDrawer {
public abstract void draw(Shape s);
}
现在,获取一些接收ShapeDrawer
的代码,并尝试使用它:
public void foo(ShapeDrawer drawer, Shape shape) {
drawer.draw(shape);
}
这段代码应该可以工作,因为ShapeDrawer
的声明承诺,无论谁实现它,都将提供一个名为draw()
的方法,该方法可以处理任何Shape
但如果你被允许这样做:
public class CircleDrawer extends ShapeDrawer {
public void draw(Circle c) {...}
}
这将不再成立,您的圆形绘图程序将无法满足它可以处理任何形状的承诺
然而,想象一下这一宣言:
public abstract class ShapeCreator {
public abstract Shape create();
}
public class CircleCreator extends ShapeCreator {
public Circle create() {...}
}
这样行吗
是的,(如果您使用Java 5或更高版本),因为与第一个声明不同,ShapeCreator
承诺它将有一个名为create()
的方法,该方法将返回一个Shape
。由于Circle
是一个Shape
,因此ShapeCreator
的子类可以决定只返回Circle
s,不会违背任何承诺
那么,你如何实现你想要的呢?请参阅:)从技术上讲不是,但您可以针对指定的功能对其进行修改
public abstract ShapeDrawer {
public abstract void draw(Shape s);
}
public CircleDrawer extends ShapeDrawer {
public void draw(Shape s){
if (s instanceof Circle) {
System.out.println("Drawing circle");
}
}
}
我可能只是看错了,但如果这不是你想要的,你能举个例子说明你想要什么吗?@Aify,我已经编辑了描述我想要实现什么的问题。希望现在更清楚了?如果不是,请告诉我。在你拔出芯片之前别忘了关机。public abstract void ShapeDrawer
your'e正在为类声明放置一个返回方法?ShapeDrawer类有两个不同的声明——一个是抽象的,另一个不是。您想要哪一个?这是可以的,但本质上与前面给出的泛型示例相同。如果我要做这样的事情,我更喜欢泛型。它很接近,但还不足以说它是一样的。通过这样做,你仍然可以在技术上通过其他形状,并做其他类型的处理-例如:打印“这不是一个圆”,或类似的东西。但是如果使用泛型,你甚至不能用非圆的东西来调用它。在内部,泛型所做的只是测试与你所做的相似的实例类型。然而,编译器应该阻止你传递任何不是圆的东西,在大多数情况下这是一个巨大的胜利。大多数情况下,就像我说的,这在技术上允许其他处理,而不是直接阻止它。我不知道为什么会有人想要它,但我认为重点在于它是一种选择,而不是它比泛型方法更好@标记空间
public abstract ShapeDrawer {
public abstract void draw(Shape s);
}
public CircleDrawer extends ShapeDrawer {
public void draw(Shape s){
if (s instanceof Circle) {
System.out.println("Drawing circle");
}
}
}