2010-03-23 16 views
7

Đoạn đầu nhỏ. Tôi đã phát triển java tốt trên 1,4 jdk. Sau khi tôi đã chuyển sang một nền tảng khác, nhưng ở đây tôi đi kèm với vấn đề vì vậy câu hỏi là mạnh mẽ về jdk 1.6 (hoặc cao hơn :)). Tôi có 3 lớp kết hợp, bản chất của khớp nối có liên quan với các phương pháp bản địa. Dưới đây là ví dụ về 3 lớp nàylớp học một phần java

public interface A 
{ 
    public void method(); 
} 
final class AOperations 
{ 
    static native method(. . .); 
} 
public class AImpl implements A 
{ 
    @Override 
    public void method(){ 
     AOperations.method(. . .); 
    } 
} 

Vì vậy, có giao diện A, được thực hiện theo cách riêng của AOperations và AImpl chỉ gọi phương thức đại diện cho phương pháp gốc. Các mối quan hệ này được tạo tự động. Mọi thứ ok, nhưng tôi đã đứng trước vấn đề. Giao diện đôi khi như A cần phơi bày khả năng lặp. Tôi có thể ảnh hưởng đến giao diện, nhưng không thể thay đổi cài đặt (AImpl).

Nói trong C# tôi có thể có thể vấn đề quyết tâm bởi một phần đơn giản: (mẫu # C)

partial class AImpl{ 
... //here comes auto generated code 
} 

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

Vì vậy, có java tương tự của một phần hoặc một cái gì đó như thế nào.

CHỈNH SỬA: Theo nhận xét của @pgras tôi cần làm rõ một số. AImpl không phải là trong chân không, có một số nhà máy (bản địa thực hiện) mà trả về trường hợp của AImpl, đó là lý do tại sao tạo ra thừa kế từ AImpl, không áp dụng.

EDITED 2: Có thể là nó không liên quan, nhưng làm thế nào nó được thực hiện bởi 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' là phương pháp tĩnh trong' Assert'. Sẽ có một 'import static org.junit.Assert. *' Hoặc tương tự ở đâu đó. Vì tất cả đều tĩnh, nó sẽ không thực sự hữu ích. – Chris

Trả lời

8

Java không có hỗ trợ cho partials hoặc các lớp mở. Các ngôn ngữ JVM khác làm, nhưng không phải Java. Trong ví dụ của bạn, điều đơn giản nhất có thể không may là sử dụng ủy quyền. Bạn có thể có AImpl của bạn lấy một đối tượng khác mà thực hiện một giao diện cho các phương thức mở rộng này. Các AImpl tạo sau đó sẽ tạo ra các phương pháp như phương pháp iterator rằng nó có thể ủy thác cho người sử dụng tạo ra đối tượng bạn vượt qua trong.

+0

+1: Đây là cách hàm tạo 'Thread (Runnable runnable)' hoạt động. – Powerlord

+0

@Russell Leggett, có thể nó không liên quan đến câu hỏi chính của tôi, nhưng làm thế nào có thể làm việc cú pháp từ ** EDITED 2 ** – Dewfy

+0

của tôi Như Chris Smith đã nói, đó là một phương pháp tĩnh, sử dụng một nhập tĩnh để xem thêm địa phương . –

1

Bạn có thể mở rộng A (nói giao diện B kéo dài A) và mở rộng AImpl và thực hiện B (lớp BImpl mở rộng AImpl thực hiện B) ...

+0

@pgras cảm ơn, nhưng "không". Tôi đã mô tả trong ** CHỈNH SỬA ** tại sao nó không được áp dụng – Dewfy

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$. 

tập tin 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 }; 
    } 
} 

tập tin Tính $ java

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

tập tin Tính $ 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; 
    } 
} 

tệp Tính $ Sub.java

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

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

thử tốt, nó được gọi là 'tổng hợp'. Thực ra cũng giống như cách tôi có thể làm với các khía cạnh - rõ ràng hơn trực quan. Dù sao +1 – Dewfy