17

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

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

示例:我有一个延伸到 Date 的类,还有一个延伸到前一个类的类。在我的新子类中,它检测到来自 Date 的所有方法,例如 getDate 等。我想要的是在我的子类中,未检测到来自 Date 的所有方法,没有抛出异常,而是完全没有检测到。

提前致谢 :)

4

5 回答 5

35

在这里优先考虑组合而不是继承。

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

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

    // no getDate() available

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

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

于 2013-05-31T21:22:40.470 回答
10

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

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

UnsupportedOperationException

但是看看你写的内容,你应该考虑让 Date 成为你类中的一个字段,而不是扩展类。

于 2013-05-31T21:08:10.133 回答
6

不可能。

如果你想要的东西是可能的,那么内在就会被打破。突然,当你使用某种 IS-A 类型时Date,你将无法调用任何Date类型的方法。这在几个层面上都是错误的。例如,它打破了里氏替换原则

于 2013-05-31T21:17:58.717 回答
5

您可以改用委托

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

  methodsYouWantToChange(){
     // new implementation
  }


  methodsYouDontWantToChange(){
     d.methodsYouDontWantToChange();
  }


  newMethods(){
     // new implementation
  }
}
于 2013-05-31T21:12:29.873 回答
0

覆盖方法并使其成为静态,它会隐藏超类的方法

于 2015-08-09T17:04:04.920 回答