在Java的一个派生类中,有没有办法“禁用”从基类继承来的方法和/或字段?
例如,假设您有一个 Shape
基类,它具有 rotate()
方法。您还有各种类型派生自 Shape
类: Square
, Circle
, UpwardArrow
等。
Shape
具有 rotate()
方法。但是我不希望 Circle
的用户能够使用 rotate()
,因为这是无意义的,或者不希望 UpwardArrow
能够旋转。
在Java的一个派生类中,有没有办法“禁用”从基类继承来的方法和/或字段?
例如,假设您有一个 Shape
基类,它具有 rotate()
方法。您还有各种类型派生自 Shape
类: Square
, Circle
, UpwardArrow
等。
Shape
具有 rotate()
方法。但是我不希望 Circle
的用户能够使用 rotate()
,因为这是无意义的,或者不希望 UpwardArrow
能够旋转。
public class Shape{
//all the generic methods except rotate()
}
public class RotatableShape extends Shape{
public void rotate(){
//Some Code here...
}
}
public class Circle extends Shape{
//Your implementation specific to Circle
}
public class Rectangle extends RotatableShape{
//Your implementation specific to Rectangle
}
您可以在想要禁用此操作的类中重写特定方法"rotate()",例如:
public void rotate() {
throw new UnsupportedOperationException();
}
编号。
Circle
类(或仅由该类实现的接口)中调用。UnsupportedOperationException
异常的实现。rotate()
的函数,该函数不执行任何操作,这将覆盖默认行为。你能在圆形中使用一个什么也不做的方法吗? 对于箭头,我会重新考虑对象层次结构。
boolean isRotatable()
,并使用它来确定是否向用户提供旋转控件。Rotatable
接口,并使用shape instanceof Rotatable
来进行判断。(然而,我认为isRotatable()
方法更加灵活。)rotate()
方法实现在不应该被旋转的类中:public void rotate() {
throw new UnsupportedOperationException("rotate");
}
Java语言没有提供一种在子类中“删除”或“禁用”方法的方式。这将违反可替换性原则并破坏多态性。子类不能从父类的API中删除可见成员。
我认为你不能按照你的建议禁用一个方法。
在你的例子中,假设你有一个接受形状的方法。
public void handleShape(Shape s){
s.rotate();
}
然后你将一个圆形传递给这个方法
handleShape(new Circle());
应该发生什么?基本上你是在要求对Java的类型系统进行根本性改变。
如果圆形是一个形状,不应该旋转,那可能意味着形状设计得不好,不应该有旋转方法。可以将旋转添加到层次结构中的另一个类中,比如RotatableShape,或者可能使用Rotatable接口。
有一种可能性,而且非常简单。不要使用继承,而是使用组合:
public class Shape{
public method1();
public method2();
public rotate();
public method3();
}
public class Circle{
private Shape shape;
public Circle(){
this.shape = new Shape();
}
public method1(){
shape.method1()
}
public method2(){
shape.method2()
}
public method3(){
shape.method3()
}
}
Rotatable
接口或类似的东西,比如public class Circle extends Shape implements Rotatable {
怎么样?这种方式可行吗?不行吗?哪种更好?(我不是专家) - Joshua Pinter