繁体   English   中英

我如何拒绝访问超类的方法

[英]How do i deny access to a method of a superclass

我想知道如何拒绝访问类超类的方法?

示例:我有一个“门”类和一个“空度”类,该类基本上只是我的应用程序的一扇打开的门,现在我想继承大多数Doors方法,但我不希望用户能够调用“关闭门”空的方法,我该怎么做?

很明显,我们无法降低覆盖方法的可见性。 如果Door上的close door方法是public ,则Emptyness的替代方法不能是private ...

一种常见的方法是在Emptyness重写关门方法,并且不执行任何操作或引发一些UnsupportedOperationException (例如Iterator实现者会这样做,如果他们不允许删除元素)。

例:

 public class Door {
   public void closeDoor() {
     // closing door actions
   }
 }

 public class Emptyness extends Door {
   @Override void closeDoor() {
     // do nothing or
     throw new UnsupportedOperationException("Can't close door on Emptyness");
   }
 }

听起来, Emptyness未能通过关于Door的“我应该成为子类”测试。 测试的是以下句子是否正确: EmptynessDoor 由于可以关闭Door ,因此“ Emptyness ”不符合该要求。

建议使用聚合而不是继承。 Emptyness实现其自己的接口(或某些其他相关接口,但不实现Door ),并包含它用来满足相关操作的Door实例。

除非将 Door#close定义为是可选的(通过有关异常的throws标记),否则执行诸如覆盖close操作以不执行任何操作或引发异常之类的操作是完全不合适的。 (并提防类层次结构中的“可选”操作,它们通常表示设计问题。不一定总是,但通常是。)示例Andreas提供了Iterator#remove的示例,例如: Iterator#remove被标记为抛出UnsupportedOperationException 如果Door#close是用这种方式标记的,并且如果您对这种处理方式感到满意,那就太好了。 但是,如果不这样做,则Emptyness无法履行Door合同,这通常意味着您需要Emptyness

在课堂上将其设为私有 因为如果您在超类中具有公共或受保护的权限,那么在向下的层次结构中 就不能具有更严格的访问修饰符。 因此,您不能在Empty类中设为私有,而必须在Door类中设为私有。

有很多选择。 选择适合您需求的

  1. 将方法设为private
  2. 使该方法成为final方法,以使其不能被覆盖,并添加逻辑检查该方法是否从Emptiness instanceof调用,然后引发异常。

      public class Emptiness extends Door{ public static void main(String[] args) throws Exception { Door x = new Emptiness(); x.somemethod(); } } 

    门类

     public class Door { final public void somemethod() throws Exception{ if(this instanceof Emptiness){ throw new Exception(); } } } 

为什么不使用Designer Pattern。 由于closeDoor方法并非对Door的所有子类都通用,因此它根本不应出现在Door类中,而应使用close方法使名称为Closable的接口成为可能,并在诸如ClosableTrue和ClosableFalse的某些类中实现该接口。 现在,在Closable类型的Door类中创建一个引用变量,并在类的构造函数中使用ClosableTrue或ClosableFalse的对象对其进行初始化,具体取决于传递给构造函数的参数的类型。 现在,无论何时在Door的任何对象或Door的子类上调用close方法,将被调用的方法将是其类用于初始化Door的构造函数的方法。 您可以实现没有有意义功能的ClosableFalse类的close方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM