小序言。我是1.4 jdk的优秀java开发人员。在它之后,我已经切换到另一个平台,但在这里我遇到了问题所以问题强烈关于jdk 1.6(或更高:))。我有3个耦合类,与本机方法有关的耦合性质。贝娄是这3级的例子
public interface A
{
public void method();
}
final class AOperations
{
static native method(. . .);
}
public class AImpl implements A
{
@Override
public void method(){
AOperations.method( . . . );
}
}
所以有接口A,它由AOperations以本机方式实现,而AImpl只是将方法调用委托给本机方法。 这些关系是自动生成的。一切都好,但我有问题。有时像A这样的接口需要暴露迭代器功能。我可以影响接口,但不能改变实现(AImpl)。
在C#中说我可以通过简单的局部解决问题: (C#样本)
partial class AImpl{
... //here comes auto generated code
}
partial class AImpl{
... //here comes MY implementation of
... //Iterator
}
所以,有部分或类似的java模拟。
EDITED : 根据@pgras的评论,我需要一些澄清。 AImpl不在真空中,有一些工厂(本机实现)返回AImpl的实例,这就是为什么从AImpl创建继承不适用。
已编辑2 : 可能它没有关系,但它是如何由JUnit 4完成的:
public class SomeTest {
...
//there is no direct inheritance from Assert, but I can use follow:
assertTrue(1==1); //HOW DOES it works??
答案 0 :(得分:8)
Java不支持partials或open类。其他JVM语言可以,但不是Java。在您的示例中,最简单的事情可能是使用委托。您可以让AImpl使用另一个实现这些扩展方法接口的对象。生成的AImpl将生成方法,例如迭代器方法,它可以委托给您传入的用户创建的对象。
答案 1 :(得分:2)
How about that:
Compute.java = your class
Compute$.java = base class for partial classes. Reference a Compute object
Compute$Add.java = your partial class. Subclass Compute$.
Compute$Sub.java = your partial class. Subclass Compute$.
文件Compute.java
public class Compute {
protected int a, b;
Compute$Add add;
Compute$Sub sub;
public Compute() {
add = new Compute$Add(this);
sub = new Compute$Sub(this);
}
public int[] doMaths() {
int radd = add.add();
int rsub = sub.sub();
return new int[] { radd, rsub };
}
}
file Compute $ .java
public abstract class Compute$ {
protected Compute $that;
public Compute$(Compute c){
$that=c;
}
}
file Compute $ Add.java
public class Compute$Add extends Compute$ {
public Compute$Add(Compute c) {
super(c);
// TODO Auto-generated constructor stub
}
public int add(){
return $that.a+$that.b;
}
}
file Compute $ Sub.java
public class Compute$Sub extends Compute$ {
public Compute$Sub(Compute c) {
super(c);
}
public int sub() {
return $that.a - $that.b;
}
}
答案 2 :(得分:1)
你可以扩展A(比如接口B扩展A)并扩展AImpl并实现B(类BImpl扩展AImpl实现B)......