在 Java 中使用接口的方法调用冲突



昨天,我接受了一次面试,得到了以下情况:

有 3 个类,即Main.java, MobilePhone.java, DeskPhone.java和一个接口ITelephone.javapowerOn()方法在类MobilePhone.javaDeskPhone.java中实现。

创建类的实例后DeskPhone如何在类中调用powerOn()方法MobilePhone?换句话说,如何在课堂的最后两个呼叫中打印"您在桌面电话课"和"您在移动电话课Main"?

有没有其他方法可以解决此问题而无需重命名powerOn()类中的任何一个方法?

主.java

public class Main {
public static void main(String[] args) {
ITelephone timsPhone;
timsPhone = new DeskPhone(123456);
timsPhone.powerOn();
timsPhone = new MobilePhone(45678);
//Question begins here 
timsPhone.powerOn();
timsPhone.powerOn();
}
} 

伊特莱电话.java

public interface ITelephone {
void powerOn();
}

手机.java

public class MobilePhone implements ITelephone{
private int myNumber;
public MobilePhone(int myNumber) {
this.myNumber = myNumber;
}
@Override
public void powerOn() {
System.out.println("You are in MobilePhone class");
}
}

桌面电话.java

public class DeskPhone implements ITelephone {
private int myNumber;
public DeskPhone(int myNumber) {
this.myNumber = myNumber;
}
@Override
public void powerOn() {
System.out.println("You are in DeskPhone class");
}
}

MobilePhone对象分配给不同的局部变量。

在当前代码中,一旦timsPhone变量的值被MobilePhone对象替换,DeskPhone对象就无法访问,并且无法调用其powerOn()方法。

建议代码:

ITelephone timsDeskPhone = new DeskPhone(123456);
timsDeskPhone.powerOn();
ITelephone timsMobilePhone = new MobilePhone(45678);
timsMobilePhone.powerOn();
timsDeskPhone.powerOn();

输出

You are in DeskPhone class
You are in MobilePhone class
You are in DeskPhone class

您可以尝试在静态方法中隔离对接口方法的调用。

public class Main {
public static void main(String[] args) {
phonePowerOn(new DeskPhone(123456));
phonePowerOn(new MobilePhone(45678));
}

static void phonePowerOn(ITelephone timsPhone){
if (timsPhone != null){    
timsPhone.powerOn();
}
}
} 

要么你误解了这个问题,这是一个技巧,要么两者兼而有之。前四行main是这样给你的吗?他们有没有告诉你你不能改变他们?那么委婉的回应可能是像这样战略性地添加几行:

static void main(String[] args){
ITelephone timsPhone;
timsPhone = new DeskPhone(123456);
timsPhone.powerOn();
ITelephone timsDeskPhone = timsPhone;
timsPhone = new MobilePhone(45678);
ITelephone timsMobilePhone = timsPhone;
timsPhone = timsDeskPhone;
timsPhone.powerOn();
timsPhone = timsMobilePhone;
timsPhone.powerOn();
}

这符合他们的规范,并显示了对接口和参考的理解。对于这样的问题,代码只是次要的。我认为他们真的在努力评估沟通、对压力的反应,甚至可能是创造力。因此,只是立即说,"你不能那样做"真的不比抛出ClassCastException好多少。

有趣的方法是以火攻火:

public class MobilePhone implements ITelephone{
private int myNumber;
public MobilePhone(int myNumber) {
this.myNumber = myNumber;
}
private int powerOnCallCount = 0;
@Override
public void powerOn() {
if (powerOnCallCount == 0){
System.out.println("You are in DeskPhone class")
} else {
System.out.println("You are in MobilePhone class");
}
powerOnCallCount++;
}
}

同样,我们只添加了代码,它符合他们的规范,并显示了对接口和引用的相同理解。

或者当然,像这样的讽刺回答通常不会在面试小组中赢得分数,但在正确的情况下会有用。请记住,他们也在接受审判。如果我已经尝试过温和地转向像第一个这样的解决方案,并且他们没有退缩,那么现在我对他们的技术知识和公司文化产生了怀疑。如果我注意到其他一些黄旗,那么我会考虑这样的事情来扭转局面。我想为之工作的那种公司会很感激我已经尝试了委婉的方法,在不影响技术知识的情况下满足了他们的规格,并且有足够的骨气来尝试我自己的测试。如果我已经确信我不想要这份工作,但想给他们最后一次机会来赢得我的支持,我可能只会求助于它。

另外,如果他们练习测试驱动设计,他们几乎必须当场为我提供工作。

最新更新