Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java部分类_Java_Code Generation_Language Features - Fatal编程技术网

java部分类

java部分类,java,code-generation,language-features,Java,Code Generation,Language Features,小序言。我是1.4JDK上的优秀java开发人员。之后,我切换到了另一个平台,但这里我遇到了问题,所以问题主要是关于JDK1.6(或更高版本:)。我有3个耦合类,耦合的性质与本机方法有关。下面是这3类的例子 public interface A { public void method(); } final class AOperations { static native method(. . .); } public class AImpl implements A {

小序言。我是1.4JDK上的优秀java开发人员。之后,我切换到了另一个平台,但这里我遇到了问题,所以问题主要是关于JDK1.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,它是由AOOperations以本机方式实现的,AImpl只是将方法调用委托给本机方法。 这些关系是自动生成的。一切都好,但我必须站在问题面前。有时接口需要公开迭代器功能。我可以影响接口,但不能更改实现(AImpl)

用C#说,我可以通过简单的部分解决问题: (C#样本)

因此,java类似于partial或类似的东西

已编辑: 根据@pgras的评论,我需要一些澄清。AImpl不是真空状态,有一些工厂(本机实现的)返回AImpl实例,这就是为什么从AImpl创建继承不适用的原因

编辑2: 可能没有关系,但JUnit4是如何实现的:

public class SomeTest {
 ...
 //there is no direct inheritance from Assert, but I can use follow:
 assertTrue(1==1); //HOW DOES it works??

您可以扩展A(比如说接口B扩展A)和扩展AImpl并实现B(类BImpl扩展AImpl实现B).

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

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;
    }
}
文件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:这就是
线程(Runnable Runnable)
构造函数的工作原理。@Russell Leggett,好吧,这可能与我的主要问题无关,但如何从我编辑的2中使用语法正如Chris Smith所说,这是一个静态方法,使用静态导入看起来更本地。@pgras谢谢,但“不”。我在《编辑:为什么它不适用》一书中描述了
assertTrue
Assert
中的一种静态方法。在某个地方会有一个
导入静态org.junit.Assert.*
之类的东西。因为它都是静态的,所以不会真正起作用。很好的尝试,这就是所谓的“聚合”。事实上,我可以用同样的方法处理方面——更直观、更清晰。无论如何+1
public class Compute$Sub extends Compute$ {
    public Compute$Sub(Compute c) {
        super(c);
    }

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