如何禁止子类使用方法?

时间:2016-12-13 17:39:24

标签: java inheritance visibility

在我的Java项目中,我有方法addType1AndType2(),它有窗口,您可以在其中展开列表并从列表中选择对象。创建它非常复杂和耗时,因为必须滚动并且xpath不断变化。这里有两个列表是实际名称,但由于公司专有信息,我只会称它们为Tyep1Type2

现在我有一个UpdateType1课程,该课程使用AddType1AndType2中所有复杂的方法,但与Type2无关。我可以复制AddType1AndType2并删除我不需要的所有内容,但这将是复制,并且必须在两个类中重复更改。这违背了继承和可重用性的目的。

我可以制作class UpdateType1 extends AddType1AndType2{}我做过的事。但是仍然存在像selectType2Value()这样的方法,它们是继承的,但在子类中是不可能的。

如果我在子类中执行@Override并将该类声明为私有,则会收到错误,我无法降低子类中的可见性。

知道我能做什么吗?现在我只是放throw new AssertError("Do not use"),但这似乎有些蹩脚。有没有更好的事情,甚至会在运行时给出编译时错误而不是断言,或者这是最好的方法吗?

3 个答案:

答案 0 :(得分:3)

问题是:你的模型错了。

继承更多,而不仅仅是在源代码中添加“A extends B”。 A extends B 表示:A是“B”。

每当你使用B对象时,你应该能够放置一个A对象(称为Liskov substitution principle)。

长话短说:如果B有A不应该有的方法......那么你不应该有A扩展B.

所以真正的答案是:你应该退后一步,仔细决定你真正想要分享的方法。你把它们放在你的基类上。还有别的事情要去。您可能可能会定义其他接口和更多基类,例如

class EnhancedBase extends Base implements AdditionalStuff {

编辑:给出你的评论;最好的方法是:

  1. 创建表示应该组合在一起的各种方法组的接口
  2. 使用组合代替扩展基类,创建一个新的类A 使用某个B对象以实现一个/更多这些新界面。
  3. 请记住这是LSP真正有意义的一个很好的例子; - )

答案 1 :(得分:1)

创建接口

public interface IAddType1 {... /* methods signtatures to add Type1 */}
public interface IAddType2 {... /* methods signtatures to add Type2 */}
public interface IUpdateType1 {...  /* methods signtatures to update Type1 */}

然后您AddType1AndType2的当前代码将成为基本辅助类:

 public abstract class BaseOperationsType1AndType2{  
     //code originally at AddType1AndType2: methods that add Type1 and Type2
 } 

然后你的新AddType1AndType2课程将是:

public class AddType1AndType2 
     extends BaseOperationsType1AndType2, 
     implements IAddType1 , IAddType2 {
        //nothing special. 
 } 

,您的新UpdateType1可以定义为

 public class UpdateType1 
      extends BaseOperationsType1AndType2 
      implements IUpdateType1 {
       //
 }

瞧。

答案 2 :(得分:0)

您可以使用'final'关键字来禁止在子类中扩展方法。

不能在子类中覆盖带有'final'修饰符的方法。