扩展抽象类后的方法

时间:2012-01-31 15:29:09

标签: java inheritance

我不知道如何描述我的问题所以我会举个例子:

public abstract class A {

  public abstract void methodToOverride();
  public void methodNotToOverride() { }

}

public class B extends A {

  @Override
  public void methodToOverride() { }
  public void someOtherMethodNotFromClassA() { }

}

现在我需要在我的代码中做这样的事情:

A object = new B();
object.someOtherMethodNotFromClassA();

但我得到“无法解决方法错误”。在抽象类中定义此类方法不是一种选择。任何线索?

5 个答案:

答案 0 :(得分:3)

这是不可能的。虽然对象是B类,但引用的类型为A.因此,您只能访问A类可见的方法。

如果你改变了这个:

A a = new B();

到此:

B a = new B();

您将能够访问someOtherMethodNotFromClassA。另一种选择是将a投射到B类型:

A a = new B();
((B)a).someOtherMethodNotFromClassA();

答案 1 :(得分:2)

尽管存在一些其他语法错误,但Oliver Weiler是正确的,Reference是A类型,因此您只能访问A类型的方法。

如果你把它转换为B类,那么你也可以访问B类方法。为了安全起见,检查一下,如果类型确实是B instanceof

A clazz = new B();
if (clazz instanceof B)
  ((B)clazz).someOtherMethodNotFromClassA();

我相信您的真实代码有点复杂,因此您可能会考虑投射......

顺便说一下:一个变量名'class'不会工作,使用一些不同的东西。

答案 2 :(得分:1)

如果确实需要使用类B中的方法,而确实需要使用抽象超类A来指定你可以使用:

A clazz = new B();
((B)clazz).someOtherMethodNotFromClassA();

请注意,这不是一个很好的做法。

答案 3 :(得分:1)

您的代码中有两个问题。

首先,您需要实际为任何抽象方法提供实现,以使您的类可以实例化。所以在你的情况下:

@Override
public void methodToOverride(){
// does nothing
}

其次,更重要的是,当您将对象实例化为类型A时,只能访问与A相关的方法。由于您将new B()定义为A类型,因此您无权访问方法someOtherMethodNotFromClassA

如果要访问它,则需要将其实例化为B类,或者将其转换为B类:

B someClass = new B();
someClass.someOtherMethodNotFromClassA();

A someClass = new B();
((B)someClass).someOtherMethodNotFromClassA();

但请记住,后一种选择非常难看并且不易维护。

答案 4 :(得分:0)

我自己刚刚遇到这个问题,这太可怕了!如果不能将子类用作参数,那么如何创建可重用代码?例如在图书馆:

base R

然后在申请中:

public abstract class AbstractSetting {
    private boolean property = false;
    public void getProperty() { return property; }
}

public abstract class AbstractFoo {
    protected AbstractSetting setting;

    protected void setSetting(AbstractSetting setting) {
        this.setting = setting;
    }

    public boolean foo() {
        setting.getProperty();
    }
} 

如何解决这个问题?