【发布时间】:2012-04-03 03:05:03
【问题描述】:
这个问题可能很简单(我希望不是),但我是在一次采访中发现的。 一般来说,给定一个接口类 IntClass,以及许多实现名为 ImpIC1、ImpIC2、...、ImpICk 的接口的类。 IntClass 中的方法是抽象的公共方法,名为 void action1()、void action2() ...、void actionM()。
我得到了一个带有公共静态函数的公共类 Test,名为:public static IntClass foo(IntClass c1, IntClass c2)。该方法对 c1 和 c2 进行一些操作以创建一个 InClass 并返回。 但是,该方法必须适用于 IntClass 的每个有效实现。问题主要在于c3的定义。我将如何设计方法 foo() ..
代码详情见下文:
public interface IntClass {
abstract void action1();
..
abstract void actionM();
}
..
public class ImpIC1 implements IntClass {
public void action1() { ... }
public void action2() { ....}
..
public void actionM() { ... }
}
...
public class ImpIC2 implements IntClass {
public void action1() { ... }
public void action2() { ....}
..
public void actionM() { ... }
}
...
public class ImpICk implements IntClass {
public void action1() { ... }
public void action2() { ....}
..
public void actionM() { ... }
}
...
public class Test {
public static IntClass foo(IntClass c1, IntClass c2) {
....
...
return c3;
}
}
...
问题主要出在c3的定义上。我尝试了以下解决方案(均无效):
- 在 foo 中,c3 被定义为 Object 的实例 .. 即 IntClass c3 = (IntClass) new Object()。 -- 编译时错误 Object cannot be cast to IntClass
- 在 foo 内部,c3 没有进行初始化。 (编译时错误)。
- foo内部,c3为null,(空指针异常)
- 在 foo 内部,c3 被初始化为 c3 的实现之一(即 c3 = (IntClass) new ImpIC1()) .. 问题是如果我们在外部 ImpIC2 中执行 s = (ImpIC1) foo(c1, c2) - 我们得到一个错误(无法转换)。
【问题讨论】:
-
c3应该是什么?它与c1和c2有什么关系? -
c3 是 IntClass 类型(它是一个接口),由函数 foo(IntCLass c1, IntClass c2) ..返回。
-
我了解您希望
c3成为IntClass。但是里面c3是什么?你是如何结合c1和c2来实现的?如果您只是想返回任何IntClass,为什么不返回return ImplC1()? -
@Ahmed Jedda - 这不是对 c3 应该是什么以及它与 c1 和 c2 的关系问题的信息性答案。我还是不明白为什么
return null;不能解决这个问题。 -
我们假设每个实现 ImpC1, ImpC2 .. ImpCk 使用不同的数据结构但相同的函数 action1() .. actionM();那么在这里我们希望函数 foo() 可以在任何实现上工作.. YET!我们在公共类 Test 中定义 foo() ! - 真的很奇怪,我想了一天!