3

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

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

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

4

4 回答 4

6

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

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

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

最好的解决方法可能是覆盖该方法并抛出运行时异常,例如UnsupportedOperationException.

是否可以更改在超类中具有相同名称的子类中的方法的参数数量?

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

于 2014-10-07T13:05:57.617 回答
1

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

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

所以这种行为是合乎逻辑的。如果 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);
}

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

于 2014-10-07T13:20:50.633 回答
1

您不能完全隐藏超类中的方法,始终可以调用,例如

  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) { ; }
}
于 2014-10-07T13:15:15.617 回答
0

Java 不支持降低可见性。

有一种方法可以做这样的事情,但它很复杂:

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

所以实现旧代码的类型对外界永远是不可见的(它可能是包私有类)。

于 2014-10-07T13:15:55.767 回答