繁体   English   中英

隐藏子类中的方法

[英]Hiding methods in subclass

我有一个带有某些已实现方法的抽象超类。

是否可以在继承自该超类的子类中隐藏该超类的方法? 我不想从某些子类的超类中看到一些方法。 最后但并非最不重要的一点是,是否可以更改子类中与超类同名的方法的参数数量?

假设我们在超类中有一个方法public void test(int a, int b) ,但现在我想要在子类中有一个方法public void test(int a) ,该方法调用超类函数,并且超类中的方法不再可见。

是否可以在继承自该超类的子类中隐藏该超类的方法?

如果您在超类中将方法设为私有,则该方法在子类(或其他任何子类)中将不可见。

但是,如果您需要基类中的方法是公共的,则无法将其隐藏在子类中,例如通过私有实现覆盖它。 (您不能“降低可见性”,即在子类中从“公开”或“受保护”变为“私有”。)

最好的解决方法可能是重写方法并抛出运行时异常,例如UnsupportedOperationException

是否可以更改子类中与超类同名的方法的参数数量?

不,您不能更改签名。 您可以创建另一个具有相同名称和不同数量参数的方法,但这将是一个不同的(重载)方法,并且基类中的方法仍然可见。

您无法从超类中完全隐藏方法,始终可以调用,例如

  MyBase o = new MyClass();
  o.test(1, 2);

但是,您可以通过特定方式覆盖该方法:

class MySuper {
  public void test(int a, int b) {; }
}

class MyClass extends MySuper {
  @Deprecated
  @Override
  public void test(int a, int b) {
    throw new UnsupportedOperationException("Do not call this method, call test(int a) instead!");
  }

  public void test(int a) { ; }
}

不,您不能在子项中隐藏公共方法,例如,通过在子项中将方法设为私有。

原因是拥有子类的实例,您可能总是将其强制转换为基类,然后在其中调用方法。

因此,这种行为是合乎逻辑的。 重新设计类层次结构,或者如果新API变得过于丑陋,则创建一个新类。

但是,您可以覆盖该方法,

/**
 * Use <code>test(a)</code> instead.
 * @param a.
 * @param b.
 */
@Deprecated
@Override
public void test(int a, int b) {
    throw new UnsupportedOperationException("Use test(int) instead.");
}

public void test(int a) { // Overloaded method
    int b = ...;
    super.test(a, b);
}

可以重载方法:相同的名称,不同的参数类型。

Java不支持降低可见性。

有一种方法可以执行以下操作,但是很复杂:

  1. 您需要为父类型创建一个接口。 该接口不需要方法。
  2. 您创建另一个新的Delegate类型,它实现方法public void test(int a, int b)
  3. 您删除当前的父类型。
  4. 您将创建两个实现接口的新类型。 一个将调用test(a,b) DelegateDelegate ,另一个则创建一个新方法test(a) ,该方法最终使用Delegate实例。

因此,实现旧代码的类型永远不会对外界可见(它可以是程序包私有类)。

暂无
暂无

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

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