【发布时间】:2012-12-20 08:21:50
【问题描述】:
在 Java 中以下是不可能的,因为接口没有实现:
class A {
protected void foo() { /* A impl */ }
protected void baz() { /* impl */ }
}
interface B {
/* here's what's impossible to have in Java. */
protected void foo() { /* B impl incl. call to baz() */ }
}
class C extends A {
/* stuff that's not in B... */
}
class D extends C implements B {
void bar() { foo(); /* uses the B impl */ }
}
class E extends A {
void bar() { foo(); /* uses the A impl */ }
}
class F extends C implements B {
void bar() { foo(); /* uses the B impl */ }
}
我想要的是让 D 继承 C,但不必重写 foo() 本身;相反,我希望它仅表明“我使用 B 的已知修改”。在这种情况下,正确的成语是什么?
注意事项:
- 是的,我确实希望需要更改我的设计;但改成什么?这就是我来这里问的。
- 我懂 Java,请不要在你的回答中重新解释抽象类和接口。
- 这应该可以通过多重继承实现 - D 可以同时继承 C 和 B(假设没有其他冲突)。
- 请使用 Java 6;如果绝对必要,Java 7; Java 8 与我无关。
- B 实现不能上移到 A 中,因为 A 实现确实是默认实现,并且其他类直接从它继承(例如 E 类)。
- C 和 B 不熟悉,不能互相提及。
- B 实现不能下移到 D,因为其他不熟悉 D 的类(例如 F 类)需要它。
- 这不是多重继承的diamond problem,因为对于要使用谁的实现没有歧义。虽然有一种菱形图案 A->B,C->D 。
【问题讨论】:
-
interface B不能有实现,只有方法签名。所以A应该是唯一有效的?? -
您不能继承
two类。所以重新检查你的程序设计来解决这个问题。 -
你不是在找抽象类吗?
-
"B 实现不能上移到 A 中,因为 A 实现确实是默认的,其他类直接继承自它(例如 E 类)。" B 不能有一个实现。它是一个接口,根据定义,它缺乏实现。你的问题没有意义,因为你一直坚持 B 已经实现了方法,这对于接口是不可能的。如果你想让B实现方法,它必须是一个类。
-
您说“在 Java 中以下是不可能的,因为接口没有实现:”,但这就是接口的全部意义所在。你还不如做一个变量
final,然后抱怨你不能改变这个变量。这就像说“这个正方形是一个坏正方形,因为我把它做成了圆形。”那为什么要绕圈呢?把它做成一个正方形就行了。你故意阻止自己做某事,然后抱怨你不能做那件事。
标签: java inheritance interface multiple-inheritance