2010-03-23 55 views
7

小序言。我是1.4 jdk上的優秀java開發人員。之後,我已經切換到另一個平臺,但在這裏,我帶着問題來解決問題,所以問題強烈的關於jdk 1.6(或更高版本:))。我有3個耦合類,與本地方法有關的耦合性質。貝婁例如,這3類java部分類

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實現,剛剛的AIMP1委託方法調用本地方法。 這些關係是自動生成的。一切都好,但我有問題。有時界面像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創建繼承不適用的原因。

組織編寫: 可能是它不涉及,但它是如何通過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

'assertTrue'是'Assert'的靜態方法。會有一個'import static org.junit.Assert。*'或其他地方。因爲它都是靜態的,所以它不會真的起作用。 – Chris 2010-03-23 17:07:06

回答

8

Java不支持部分類或公開類。其他JVM語言,但不是Java。在你的例子中,最簡單的事情可能不幸的是使用委派。你可以讓你的AImpl接受另一個滿足這些擴展方法接口的對象。然後,將產生的AIMP1會產生方法,比如迭代方法,它可以委託給你傳遞用戶創建的對象。

+0

+1:這是'Thread(Runnable runnable)'構造函數的工作方式。 – Powerlord 2010-03-23 16:50:35

+0

@Russell Leggett,好吧,可能它不涉及我的主要問題,但怎麼可以從我的工作語法** EDITED 2 ** – Dewfy 2010-03-23 16:58:49

+0

正如Chris Smith所說,這是一個靜態方法,使用靜態導入來查看更多本地。 – 2010-03-23 17:51:43

1

你可以擴展A(說接口B A擴展)和延長的AIMP1和實施B(類BImpl擴展AImpl實現B)...

+0

@pgras謝謝,但「不」。我在** EDITED **中描述了爲什麼它不適用 – Dewfy 2010-03-23 16:51:45

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

文件計算$的.java

public abstract class Compute$ { 
    protected Compute $that; 
    public Compute$(Compute c){ 
     $that=c; 
    } 
} 

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

文件計算$ Sub.java

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

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

不錯的嘗試,這就是所謂的'聚合'。事實上,我可以用相同的方式處理這些問題 - 這更直觀明瞭。無論如何+1 – Dewfy 2013-07-19 07:45:11