【问题标题】:How to completely hide superclass method in Java如何在Java中完全隐藏超类方法
【发布时间】:2013-05-31 21:04:13
【问题描述】:

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

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

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

提前致谢:)

【问题讨论】:

  • 没有办法做到这一点......唯一的解决方案是让同名的方法在父类中为private,但这意味着它不能从任何地方调用除了父类。
  • 我试图在我的超类中将 getDate 覆盖为私有,但它给了我一个错误,我应该将它更改为 public。

标签: java


【解决方案1】:

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

与其继承 Date,不如将其作为 MyDate 类中的成员字段。

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

    // no getDate() available

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

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

【讨论】:

  • 嗯,Joda Date 使用这样的模式吗?因为它的返回类型是 DateTime 而不是 Date,虽然有一个方法可以把它转换成 Date。
  • 这就是它的美妙之处。您可以完全控制 API。从方法名称到返回类型。您可以根据需要选择简化和/或限制 API。
  • 好的,我发现这是最接近我的问题的答案,我正在尝试理解逻辑。顺便说一下@Ravi -san,你知道为什么当我有这个Date d=new Date(); System.out.println(d); 时,它会产生类似Sat Jun 01 04:44:47 ICT 2013 的输出。但是当我像MyClass mc=new MyClass(); System.out.println(mc);这样声明自己的类对象时,它会产生像MainPackage.MyClass@110b053这样的输出当我输出我的类对象时如何有像Date对象这样的输出?
  • 这可以让您完全控制 API,但您不再拥有子类。 Date 变量不能同时包含 HebrewDateJapaneseDate
  • 重写 toString() 方法并委托给 Date 对象
【解决方案2】:

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

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

UnsupportedOperationException

但是看看你写的内容,你应该考虑在你的类中设置一个字段,而不是扩展类。

【讨论】:

    【解决方案3】:

    您可以改用委托

    public class NewDate{
      Date d;
      NewDate(){
         d = new Date();
      }
    
      methodsYouWantToChange(){
         // new implementation
      }
    
    
      methodsYouDontWantToChange(){
         d.methodsYouDontWantToChange();
      }
    
    
      newMethods(){
         // new implementation
      }
    }
    

    【讨论】:

    • 委托可以是一个简洁的解决方案,lombok 也可以让它看起来干净:projectlombok.org/features/Delegate.html
    • 这个委托不允许我的类有一个日期的返回类型,对吗?
    • :/ 我不太明白这个委托是做什么的,因为它没有扩展到 Date 类,我认为它的返回类型不会是 Date。
    • en.wikipedia.org/wiki/Delegation_pattern .. 检查这个以了解委托模式
    【解决方案4】:

    不可能。

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2011-08-15
        • 2011-11-17
        • 2011-06-24
        • 1970-01-01
        • 2014-09-18
        • 2015-08-01
        • 1970-01-01
        • 2011-01-26
        • 1970-01-01
        相关资源
        最近更新 更多