2017-07-17 85 views
4
public class BaseClass { 
    /** 
    * Gets the value. 
    */ 
    public final String getValue() { 
     // returns something. 
    } 
} 

public class SubClass extends BaseClass { 
    /** 
    * Gets the value. 
    * <p/> 
    * The value is meaningless for SubClass. 
    */ 
    @Override // Cannot override final method 
    public final String getValue() { 
     super.getValue(); // Not overriding implementation, just javadoc 
    } 
} 

我不需要改变最终方法的实现,我只是想改变它的Javadoc。如何覆盖子类中的最后一个方法的javadoc?

+2

*“该值对于SubClass是没有意义的。”*这告诉我们子类不应该是子类,因为它不通过“是”测试。如果这个值对'BaseClass'有意义,那么'SubClass'应该是有意义的,因为'SubClass'是一个'BaseClass'(加号)。为'BaseClass'编写的代码,可能希望'value'有意义,应该使用'SubClass'。也许你想要组成而不是继承。 –

+1

呃...你不能。为什么不简单地把解释放到班级的文件中? – Seelenvirtuose

+0

你的问题没有意义。您无法重写该方法,那么为什么要重写它的文档? – EJP

回答

7

简而言之:你不能那样做。如果有的话,你可以在该子类的定义中加入一些javadoc,以解释最后一种方法的行为已经发生了变化。如果你可以这样做 - 你可以改变基类类的javadoc来说:“子类可能使这个方法失效”或类似的东西。

除此之外,你应该明白,这也是一个可疑想法明智的。

继承不是主要关于代码重用。这是关于表达一些A类is-a B,因为A扩展B.因此,当您决定在子类上创建方法毫无意义的时,您基本上使超类的合约无效。这是不好的做法(请参阅Liskov substitution principle为什么你必须小心,当修改继承方法的合同)。

你看,那个关键字最后不仅是编译器的信息。它还表示意图由谁使用它的人非常方法。这个人说:“我不希望用这种方法得到脾气!”

+2

特别是如果方法被声明为“final”,则意味着没有任何子类会通过重载它来混淆它。 – fhossfel

+0

好点。把我的答案说成是这个。 – GhostCat

2

这不是Java预见到的,因此使用标准Java工具是不可能的。尽管如此,你可以在课堂上提供更详细的解释。您也可以尝试查看Javadoc API(Doclet API)并搜索它的一些自定义实现或实现您自己的扩展,例如,在类级别引入新的注释,并实现自定义的Javadoc生成器来尊重这些。我不知道这样的事情是否已经存在。

更新: 另请参阅GhostCat answer,他有很多原因让你不应该那样做。