根据这个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()
方法。
答案 0 :(得分:1)
基本上,因为controlSafety
不是Pilot
类的特征之一。因此,当您尝试从controlSafety
声明的对象调用Pilot
时,编译器会检查它是否在Pilot
类中声明,如果不是,则不允许您调用它。
所以C141
是Pilot
也是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();