无法在从接口实现的子类中调用方法

时间:2015-01-28 11:15:39

标签: java oop inheritance interface

根据这个answer我试图像这样实现它

抽象类(Pilot):

public abstract class Pilot{
    abstract void fly();
}

界面(安全主任):

public interface ISafetyOfficer {
        void controlSafety();
}

儿童班:

public class C141 extends Pilot implements ISafetyOfficer{
    void fly(){ 
        System.out.println("I'm flying C-141.");
    }

    public void controlSafety(){
        System.out.println("I'm control safety.");
    }

并且在Main类的main()中无法调用controlSafety()方法

public class Main {
    public static void main(String[] args) {
        Pilot pilot = new C141();
        pilot.fly();
        pilot.controlSafety(); // Cannot call controlSafty here.
    }
}

问题发生在函数main()中。任何人都可以告诉我为什么我不能以OOP方式调用controlSafety()方法。

5 个答案:

答案 0 :(得分:1)

基本上,因为controlSafety不是Pilot类的特征之一。因此,当您尝试从controlSafety声明的对象调用Pilot时,编译器会检查它是否在Pilot类中声明,如果不是,则不允许您调用它。

所以C141Pilot也是ISafetyOfficer

Pilot不是ISafetyOfficer

答案 1 :(得分:0)

您可以将C141转换为ISafetyOfficer然后调用它。 Java不是一种鸭子类型的语言。

答案 2 :(得分:0)

因为您将C141类向上转换为Pilot抽象类。但是Pilot类没有controlSafety()方法。

答案 3 :(得分:0)

Pilot类没有方法controlSafety(),这就是编译器找不到该方法的原因。

Pilot pilot = new C141()它是多态的,但只有Pilot类中存在的方法才会被调用,而不是来自方法接口ISafetyOfficer的调用。

答案 4 :(得分:0)

语句Pilot pilot = new C141();的左手/引用变量确定可以在分配给它的对象上调用哪些方法。在这种情况下,其类型为Pilot,并且由于Pilot类没有方法controlSafety(),因此无法使用类型Pilot的引用来调用它。您可以通过类型转换在这种情况下执行解决方法: -

  Pilot pilot = new C141();
  pilot.fly();
  C141 c=(C141)pilot;
  c.controlSafety();
  //or
  ISafetyOfficer isafe=(ISafetyOfficer)pilot;
  isafe.controlSafety();

同样来自OOP pov,飞行员意图飞行而不是控制安全,这就是安全官员的用途,因此你不能告诉飞行员做控制安全。理想的方式应该是: -

  Pilot pilot = new C141();
  pilot.fly();
  ISafetyOfficer isafe=new C141();
  isafe.controlSafety();