如何在Java中完全隐藏超类方法

A-S*_*-SM 13 java

最近我正在考虑制作自己的日期库.我在这里发现了一个问题,这里是:

如何在子类中隐藏超类方法?所以它不会在子类中被检测到.

示例:我有一个扩展到Date的类,以及一个扩展到上一个类的另一个类.在我的新子类中,它检测来自Date的所有方法,比如getDate等.我想要的是,在我的子类中,来自Date的所有方法都未被检测到,没有抛出异常,但完全未被发现.

提前致谢 :)

Rav*_*yal 29

在这里赞成组合而不是继承.

而不是继承Date将其作为MyDate类中的成员字段.

public class MyDate {
    private Date dt = new Date();

    // no getDate() available

    public long getTime() {
        return date.getTime();
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以完全控制子类可见的Date API(无需抛出任何异常),但是当您要隐藏的方法数量超出您希望保持可访问的方法时,此方法更实用.

  • 覆盖toString()方法并委托给Date对象 (2认同)

Veg*_*ard 9

如果扩展,则无法隐藏它,但您可以覆盖.

如果您希望您的API用户不使用该方法,我建议覆盖并抛出此异常:

UnsupportedOperationException
Run Code Online (Sandbox Code Playgroud)

但是看看你写的是什么,你应该考虑将Date作为你班上的一个字段,而不是扩展课程.


Tom*_*lka 6

不可能.

如果你想要的是可能的,那么继承就会被打破.突然间,当您使用某种IS-A类型时Date,您将无法调用任何Date类型的方法.这在几个层面上是错误的.例如,它打破了Liskov替代原则.


sti*_*ike 5

您可以使用委派代替

public class NewDate{
  Date d;
  NewDate(){
     d = new Date();
  }

  methodsYouWantToChange(){
     // new implementation
  }


  methodsYouDontWantToChange(){
     d.methodsYouDontWantToChange();
  }


  newMethods(){
     // new implementation
  }
}
Run Code Online (Sandbox Code Playgroud)