簡體   English   中英

Java局部類

[英]java partial classes

小序言。 我是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模擬。

編輯 :根據@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??

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

您可以擴展A(例如,接口B擴展A)並擴展AImpl和實現B(類BImpl擴展AImpl實現B)...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM