Java部分类

7

简要介绍一下,我曾经是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#来说,我可以通过简单的partial解决问题:

(C#样例)
partial class AImpl{
 ... //here comes auto generated code
} 

partial class AImpl{
 ... //here comes MY implementation of 
 ... //Iterator 
} 

那么,Java有部分函数或类似的东西吗?

编辑:根据@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??

1
assertTrueAssert中的一个静态方法。在某个地方会有类似于import static org.junit.Assert.*的导入语句。由于它全部都是静态的,所以这并没有什么帮助。 - Chris
3个回答

8

Java不支持部分类或开放类,但其他JVM语言可以。在您的示例中,最简单的方法可能是使用委托。您可以让AImpl接受实现这些扩展方法的接口的另一个对象。然后生成的AImpl将具有生成的迭代器方法等,它可以将其委托给您传递的用户创建的对象。


+1:这是 Thread(Runnable runnable) 构造函数的工作原理。 - Powerlord
@Russell Leggett,好的,也许它与我的主要问题无关,但是我应该如何使用我编辑2中的语法。 - Dewfy
正如Chris Smith所说,这是一个静态方法,使用静态导入可以使其看起来更本地化。 - Russell Leggett

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 };
    }
}

文件 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;
    }
}

文件 Compute$Sub.java

public class Compute$Sub extends Compute$ {
    public Compute$Sub(Compute c) {
        super(c);
    }

    public int sub() {
        return $that.a - $that.b;
    }
}

不错的尝试,这就是所谓的“聚合”。实际上,我可以用更直观清晰的方式来处理方面。无论如何+1。 - Dewfy

1

你可以扩展A(比如接口B扩展A),并扩展AImpl并实现B(类BImpl扩展AImpl并实现B)...


@pgras谢谢,但“不行”。我已经在编辑中说明了为什么它不适用。 - Dewfy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接