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

如何在Java中完全隐藏超类方法,java,Java,最近我在考虑建立自己的日期库。 我发现了一个问题,就是: 如何在子类中隐藏超类方法?所以它不会在子类中被检测到 例如: 我有一个扩展到最新的类,还有一个扩展到上一个类的类。 在我的新子类中,它检测Date中的所有方法,如getDate等。 我想要的是,在我的子类中,从Date开始的所有方法都是未被检测到的,而不是抛出 异常,但完全未被发现 提前感谢:)如果它被扩展,您不能隐藏它,但您可以覆盖它 如果您希望您的API用户不使用该方法,我建议重写并引发此异常: UnsupportedOperatio

最近我在考虑建立自己的日期库。 我发现了一个问题,就是:

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

例如: 我有一个扩展到最新的类,还有一个扩展到上一个类的类。 在我的新子类中,它检测Date中的所有方法,如getDate等。 我想要的是,在我的子类中,从Date开始的所有方法都是未被检测到的,而不是抛出 异常,但完全未被发现


提前感谢:)

如果它被扩展,您不能隐藏它,但您可以覆盖它

如果您希望您的API用户不使用该方法,我建议重写并引发此异常:

UnsupportedOperationException

但是,看看你写的东西,你应该考虑在课堂上把日期定为一个字段,而不是扩展类。

你可以使用委托代替

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

  methodsYouWantToChange(){
     // new implementation
  }


  methodsYouDontWantToChange(){
     d.methodsYouDontWantToChange();
  }


  newMethods(){
     // new implementation
  }
}
不可能

如果你想要的是可能的,那么内在的力量就会被打破。突然,当您使用某个IS-a类型的
Date
时,您将无法调用任何
Date
类型方法。这在几个层面上都是错误的。例如,它打破了。

这里的组合优先于继承

不要继承日期,而是将其作为MyDate类中的成员字段


您可以完全控制对子类可见的日期API(无需抛出任何异常),但当您想要隐藏的方法数量超过您想要保持可访问的方法时,这种方法更为实用。

重写该方法并使其成为静态,它将隐藏超级类的方法

无法做到这一点。。。唯一的解决方案是在父类中将同名的方法设为
private
,但这意味着它不能从父类以外的任何地方调用。我曾尝试在超类中将getDate重写为private,但它给了我一个错误,我应该将其更改为public。委派可以是一个简洁的解决方案,lombok还可以使它看起来更干净:此委托不允许我的类具有日期的返回类型,是吗?:/我真的不明白此委托用于什么,因为它不扩展到日期类,我认为它的返回类型不会是日期。。选中此项了解委派模式嗯,Joda Date是否使用这样的模式?因为它的返回类型是DateTime而不是Date,尽管有一种方法可以将其转换为Date。这就是它的优点。您可以完全控制API。从方法名到返回类型。您可以根据需要选择简化和/或限制API。好的,我发现这是最接近我问题的答案,我正在尝试理解逻辑。顺便问一下@Ravi-san,你知道为什么我有这个
dated=newdate();系统输出打印ln(d)它将产生类似Sat Jun 01 04:44:47 ICT 2013的输出。但是当我声明自己的类对象时,比如
MyClass mc=newmyclass();系统输出打印项次(mc)它生成一个类似MainPackage的输出。MyClass@110b053当我输出我的类对象时,我如何有一个像Date对象这样的输出?这可以让你完全控制API,但你不再有一个子类了。
Date
变量不能同时保存
HebrewDate
JapaneseDate
then。重写toString()方法并委托给Date对象
public class MyDate {
    private Date dt = new Date();

    // no getDate() available

    public long getTime() {
        return date.getTime();
    }
}