2010-03-23 20 views
7

Pequeño preámbulo. Yo era un buen desarrollador de Java en 1.4 jdk. Después de esto, he cambiado a otras plataformas, pero aquí tengo un problema, por lo que la pregunta es fuertemente sobre jdk 1.6 (o superior :)). Tengo 3 clases acopladas, la naturaleza del acoplamiento relacionado con los métodos nativos. Abajo es un ejemplo de esta clase 3clases parciales de Java

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

Así que hay una interfaz, que se implementa en forma nativa por AOperations, y sólo AImpl delegados método de llamada a los métodos nativos. Estas relaciones se generan automáticamente. Todo está bien, pero tengo un problema antes. En algún momento, la interfaz como A necesita exponer la capacidad del iterador. Puedo afectar la interfaz, pero no puedo cambiar la implementación (AImpl).

Decir en C# que podría ser capaz de resolver un problema por simple parcial: (C# muestra)

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

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

Por lo tanto, tiene analógica Java del parcial o algo así.

EDITADO: Según el comentario de @pgras, necesito algunas aclaraciones. AImpl no está en el vacío, hay alguna fábrica (implementada nativamente) que devuelve la instancia de AImpl, por eso la creación de herencia de AImpl no es aplicable.

Editado 2: Puede ser que no se refiere, pero la forma en que se realiza por 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' es un método estático en' Assert'. Habrá un 'import static org.junit.Assert. *' O similar en alguna parte. Como todo es estático, no será de gran ayuda. – Chris

Respuesta

8

Java no tiene soporte para partials o clases abiertas. Otros lenguajes JVM sí, pero no Java. En su ejemplo, lo más simple puede ser desafortunadamente usar la delegación. Puede hacer que su AImpl tome otro objeto que cumpla una interfaz para estos métodos de extensión. El AImpl generada entonces habría generado métodos tales como los métodos de iterador que podría delegar en el objeto creado por el usuario que se pasa en.

+0

+1: así es como funciona el constructor 'Thread (Runnable runnable)'. – Powerlord

+0

@Russell Leggett, vale, puede ser que no se relaciona con mi pregunta principal, pero ¿cómo puede trabajar la sintaxis de mi ** EDITADO 2 ** – Dewfy

+0

Como dijo Chris Smith, ese es un método estático, usando una importación estática para parecer más local . –

1

Usted podría extenderse A (interfaz decir B parte A) y extender AImpl e implementar B (clase BImpl extiende AImpl implementa B) ...

+0

@pgras gracias, pero "no". He descrito en ** EDITADO ** por qué no es aplicable – 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$. 

archivo Compute.java

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

Calcule $ .java

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

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

buen intento, es lo que se llama 'agregación'. De hecho, de la misma manera que podría hacer con los aspectos, que son más intuitivos y claros. De todos modos +1 – Dewfy

Cuestiones relacionadas