2010-03-23 7 views
7

Mała preambuła. Byłem dobrym programistą Java w wersji 1.4 jdk. Po tym przerzuciłem się na inne platformy, ale tutaj przychodzę z problemem, więc pytanie jest zdecydowanie o jdk 1.6 (lub wyżej :)). Mam 3 sprzężoną klasę, charakter sprzężenia związanego z natywnymi metodami. Bellow jest przykładem tego 3 klasyKlasy częściowe java

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

Więc nie ma interfejsu A, który jest realizowany w sposób natywny przez AOperations i AImpl tylko delegaci metoda wywołanie metod natywnych. Te relacje są generowane automatycznie. Wszystko w porządku, ale mam przed sobą problem. Czasami interfejs taki jak A need expose iterator capability. Mogę wpływać na interfejs, ale nie mogę zmienić implementacji (AImpl).

Mówiąc w języku C# Mogę być w stanie rozwiązać problemu zwykłą częściowej: (# próbka C)

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

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

Więc ma java analog częściowe lub coś podobnego.

EDYTOWANA: Zgodnie z komentarzem @pgras potrzebuję wyjaśnienia. AImpl nie znajduje się w próżni, jest jakaś fabryka (natywnie zaimplementowana), która zwraca instancję AImpl, dlatego tworzenie dziedziczenia z AImpl nie ma zastosowania.

EDYCJI 2: Może to nie dotyczy, ale jak to jest zrobione przez 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' jest metodą statyczną w' Assert'. Pojawi się 'import static org.junit.Assert. *' Lub coś podobnego. Ponieważ wszystko jest statyczne, tak naprawdę nie pomoże. – Chris

Odpowiedz

8

Java nie obsługuje częściowych ani otwartych klas. Inne języki JVM, ale nie Java. W twoim przykładzie najprostszym rozwiązaniem może być niestety delegacja. Możesz pozwolić twojemu AImpl wziąć inny obiekt, który spełnia interfejs tych metod rozszerzenia. Wygenerowany AImpl by następnie wygenerowaniu metod, takich jak metody iteracyjnej, że może przekazać użytkownika tworzony obiekt, który przepustkę.

+0

+1: Tak działa konstruktor 'Thread (Runnable runnable)'. – Powerlord

+0

@Russell Leggett, ok może to nie ma związku z moim głównym pytaniem, ale jak działa składnia z mojego ** EDYTOWANEGO 2 ** – Dewfy

+0

Jak powiedział Chris Smith, jest to statyczna metoda, używająca statycznego importu, aby wyglądać bardziej lokalnie . –

1

Można rozszerzyć (powiedzmy B rozszerza interfejs A) i rozszerzyć AImpl i wdrożenia B (klasa BImpl rozszerza implementacje AImpl B) ...

+0

@pgras dzięki, ale "nie". Opisałem w ** EDYTOWANE ** dlaczego to nie ma zastosowania – 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$. 

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

plik Oblicz $ .java

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

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

plik Compute $ Sub.java

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

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

miła próba, to się nazywa "agregacja". Właściwie to samo, co mogłem zrobić z aspektami - które są bardziej intuicyjne. W każdym razie +1 – Dewfy