Jea*_*ett 28 java derived-class
在Java派生类中,有没有办法"禁用"从基类继承的方法和/或字段?
例如,假设您有一个Shape具有rotate()方法的基类.您也可以从衍生出多种Shape类:Square,Circle,UpwardArrow等.
Shape有一个rotate()方法.但是我不想rotate()让用户可以使用Circle,因为它没有意义,或者是用户UpwardArrow,因为我不希望UpwardArrow能够旋转.
Cha*_*ndu 39
我不认为这是可能的.然而,你可以进一步细化的形状由类去除旋转()从它的规范方法,而是定义另一个子形状称为RotatableShape,让圈中获得的形状以及所有其他可旋转类从RotatableShape.
例如:
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
}
Run Code Online (Sandbox Code Playgroud)
Wav*_*vyx 17
您可以覆盖要禁用此操作的类中的特定方法"rotate()",如下所示
public void rotate() {
throw new UnsupportedOperationException();
}
Run Code Online (Sandbox Code Playgroud)
不。
Circle类(或仅由该类实现的接口)中下拉该方法UnsupportedOperationException不支持它的类的实现。如果你需要在子类中禁用方法,那么你有一个糟糕的类层次结构.任何子类都应该能够顺利使用其超类的方法.这被称为"Liskov Substitution Principal"(https://en.wikipedia.org/wiki/Liskov_substitution_principle).您可以在此主题中阅读更多相关信息:https://softwareengineering.stackexchange.com/questions/219543/should-a-class-know-about-its-subclasses.
做Chandu建议.不要将rotate()放在Shape中.相反,创建一个名为RotatableShape的Shape的子类,并在其中放置rotate().然后Circle可以从Shape继承,Rectangle可以从RotatableShape继承.
| 归档时间: |
|
| 查看次数: |
26391 次 |
| 最近记录: |