java部分类
小序言。我是1.4JDK上的优秀java开发人员。之后,我切换到了另一个平台,但这里我遇到了问题,所以问题主要是关于JDK1.6(或更高版本:)。我有3个耦合类,耦合的性质与本机方法有关。下面是这3类的例子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 {
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;
}
}