在派生类上禁用继承的方法

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)

  • +1比抛出`UnsupportedOperationException`更好的解决方案. (4认同)

Wav*_*vyx 17

您可以覆盖要禁用此操作的类中的特定方法"rotate()",如下所示

public void rotate() {
    throw new UnsupportedOperationException();
}
Run Code Online (Sandbox Code Playgroud)

  • 这回答了更普遍的问题,即开发人员可能不会同时创建超类。 (2认同)

Boz*_*zho 5

不。

  • 您只能在Circle类(或仅由该类实现的接口)中下拉该方法
  • 您可以提供一个空的实现或那些抛出UnsupportedOperationException不支持它的类的实现。


Nic*_*ews 5

如果你需要在子类中禁用方法,那么你有一个糟糕的类层次结构.任何子类都应该能够顺利使用其超类的方法.这被称为"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继承.