如何禁止子类使用方法



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

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

我可以做一个我已经完成的class UpdateType1 extends AddType1AndType2{}。但是仍然有类似selectType2Value()的方法在子类中继承但不可能。

如果我做@Override并将该类声明为子类中的私人,则会发现一个错误,我无法降低子类中的可见性。

知道我能做什么?现在,我只是放了一个throw new AssertError("Do not use"),但这似乎很la脚。有更好的事情要做,甚至会出现编译时错误而不是在运行时断言,还是最好的方法?

事实是:您的模型是错误的。

继承是更多的,而不仅仅是将" A扩展B"放在源代码中。 a扩展b 表示:a"是" b。

每当您使用B对象时,都应该能够将A对象放置(称为Liskov替代原理)。

长话短说:如果b的方法不应该有...那么您就不应该b。

因此,真正的答案是:您应该退后一步,仔细确定您真正想共享的方法。您将这些放在基础课上。其他任何事情都必须走。您可能会定义其他接口和更多的基类,例如

class EnhancedBase extends Base implements AdditionalStuff {

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

  1. 创建表示应该融合在一起的各种方法组的接口
  2. 而不是扩展该基类,使用 COMPOINT :创建一个新的类A,该类别使用一些B对象以实现一个/这些新接口中的更多。

并记住这是一个很好的例子,为什么LSP真正有意义; - )

创建接口

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 {
       //
 }

voila。

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

具有"最终"修饰符的方法不能在子类中覆盖。

最新更新