冲突使用接口在Java中
昨天方法调用的,我有一个面试,我得到了以下方案:冲突使用接口在Java中
有3类,即Main.java, MobilePhone.java, DeskPhone.java
和一个接口ITelephone.java
。 powerOn()
方法在类别MobilePhone.java
和DeskPhone.java
中实施。
创建MobilePhone
类的实例后,如何在DeskPhone
类中调用powerOn()
方法?换句话说,如何在Main
类的最近两次调用中打印“您处于DeskPhone类”和“您处于MobilePhone类”?
有没有其他方法可以解决这个问题,而无需在任何一个类中重命名powerOn()
方法?
Main.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();
}
}
ITelephone.java
public interface ITelephone {
void powerOn();
}
MobilePhone.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");
}
}
DeskPhone.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++;
}
}
同样,我们只添加的代码,它符合其规格,并显示接口和引用相同的理解。
或者当然,这样的讽刺回答通常不会在面试小组中赢得积分,但是在正确的情况下使用。请记住,他们也正在试用。如果我已经试着轻缓地走向像第一个那样的解决方案,并且他们不退缩,现在我开始怀疑他们的技术知识和公司文化。如果我注意到其他一些黄旗,那么我会考虑类似这样的表格。我希望工作的那种公司会明白,我已经尝试了这种巧妙的方法,在不牺牲技术知识的情况下满足了他们的规范,并且有足够的脊柱来尝试我自己的测试。如果我已经确信我不想要这份工作,但是想给他们最后一次机会来赢得我,我可能只会诉诸于此。
另外,如果他们练习测试驱动设计,他们几乎不得不在现场为我提供工作。
他们告诉我,如何修改这个程序只需要进行一些更改并按预期打印输出?正如你在程序中提到的那样,它也可以工作,但我必须提供优化代码。所以,如果我创建'timsMobilePhone.powerOn(); timsDeskPhone.powerOn();',我们得到我们想要的输出。 – jParmar
使用显式转换'((DeskPhone)timsPhone).powerOn();' –
@IvanPronin这只是给你一个'ClassCastException'。 – Kayaman
当你将MobilePhone分配给DeskPhone对象时,timsPhone会丢失对它的引用 – Sarkhan