2011-07-04 19 views
21

Intenté simplificar mi situación lo más posible. Tengo tres clases:Java: Cómo acceder a métodos de otra clase

Alfa:

public class Alpha { 
    public void DoSomethingAlpha() { 
      cbeta.DoSomethingBeta() //? 
    } 
} 

Beta:

public class Beta { 
    public void DoSomethingBeta() { 
      // Something 
    } 
} 

principal:

public class MainApp { 
    public static void main(String[] args) {   
      Alpha cAlpha = new Alpha(); 
      Beta cBeta = new Beta(); 
    } 
} 

espero no más de simplificarlo. Mi pregunta es ¿cómo puedo acceder a cBeta.DoSomethingBeta() desde un método en Alpha?

+0

Usted ha definitivamente demasiado simplificado ella. Alpha no tiene referencia a cbeta, DoSomethingBeta se define como un constructor, etc. ¿Qué es exactamente lo que no funciona para usted? – g051051

Respuesta

27

Necesita darle a la clase Alpha una referencia a cBeta. Hay tres formas de hacer esto.

1) Déle a Alphas una Beta en el constructor. En la clase de escritura Alfa:

public class Alpha { 
    private Beta beta; 
    public Alpha(Beta beta) { 
    this.beta = beta; 
    } 

y llamar cAlpha = nuevo Alfa (Cbeta) de la principal()

2) dar Alfas un mutador que les da una beta.En clase Alpha escribe:

public class Alpha { 
    private Beta beta; 
    public void setBeta (Beta newBeta) { 
    this.beta = beta; 
    } 

y llama a cAlpha = new Alpha(); cAlpha.setBeta (beta); from main(), o

3) tienen un beta como argumento para hacer AlgoAlfa. en clase Alpha escribir:

public void DoSomethingAlpha(Beta cBeta) { 
     cbeta.DoSomethingBeta() 
} 

La estrategia que utiliza depende de algunas cosas. Si quieres que cada Alfa tenga una versión Beta, usa el número 1. Si solo quieres que algunos Alphas tengan una versión Beta, pero quieres que retengan sus Betas indefinidamente, usa el número 2. Si quieres que Alphas trate solo con Betas, Mientras llamas a doSomethingAlpha, usa el número 3. El alcance de la variable es complicado al principio, pero se vuelve más fácil cuando le das la vuelta. ¡Avíseme si tiene más preguntas!

+0

Gracias, no creo que el tercero vaya a funcionar con mi caso, pero el número 1 debería funcionar. Debería haber puesto esto, pero tanto "Alpha" como "Beta" crean diferentes JFrames. "Alpha" tiene una casilla de verificación, que "Beta" necesita saber si está marcada. – co757

0

O se necesita para crear un objeto de tipo Beta en la clase alfa o su método

Al igual que hacemos aquí en el principal Beta = Cbeta nueva Beta();

Si desea utilizar la variable que cree en su principal entonces usted tiene que analizar a cAlpha como parámetro al hacer que el aspecto constructor de Alfa como

public class Alpha 
{ 

    Beta localInstance; 

    public Alpha(Beta _beta) 
    { 
     localInstance = _beta; 
    } 


    public void DoSomethingAlpha() 
    { 
      localInstance.DoSomethingAlpha();  
    } 
} 
0

Tal vez usted necesita un poco dependency injection

public class Alpha { 

    private Beta cbeta; 

    public Alpha(Beta beta) { 
     this.cbeta = beta; 
    } 

    public void DoSomethingAlpha() { 
     this.cbeta.DoSomethingBeta(); 
    } 
} 

y luego

Alpha cAlpha = new Alpha(new Beta()); 
14

Método 1:

Si el método DoSomethingBeta era estático sólo necesita llamar:

Beta.DoSomethingBeta(); 

Método 2:

Si Alfa Beta se extiende desde que se podría llamar DoSomethingBeta() directamente.

public class Alpha extends Beta{ 
    public void DoSomethingAlpha() { 
      DoSomethingBeta(); //? 
    } 
} 

Método 3:

Alternativamente, usted necesita tener acceso a una instancia de Beta a llamar a los métodos de la misma.

public class Alpha { 
    public void DoSomethingAlpha() { 
      Beta cbeta = new Beta(); 
      cbeta.DoSomethingBeta(); //? 
    } 
} 

Por cierto es esta tarea?

0
public class WeatherResponse { 

private int cod; 
private String base; 
private Weather main; 

public int getCod(){ 
    return this.cod; 
} 

public void setCod(int cod){ 
    this.cod = cod; 
} 

public String getBase(){ 
    return base; 
} 

public void setBase(String base){ 
    this.base = base; 
} 

public Weather getWeather() { 
    return main; 
} 

// default constructor, getters and setters 
} 

otra clase

public class Weather { 

private int id; 
private String main; 
private String description; 

public String getMain(){ 
    return main; 
} 

public void setMain(String main){ 
    this.main = main; 
} 

public String getDescription(){ 
    return description; 
} 

public void setDescription(String description){ 
    this.description = description; 
} 

// default constructor, getters and setters 
} 

// acceder a métodos
// éxito!

Log.i("App", weatherResponse.getBase()); 
    Log.i("App", weatherResponse.getWeather().getMain()); 
    Log.i("App", weatherResponse.getWeather().getDescription()); 
0

Tengo otra solución. Si Alpha y Beta son su única clase extra, entonces ¿por qué no crear una variable estática con la imagen de la clase?

Al igual que en la clase alfa:

public class Alpha{ 
     public static Alpha alpha; 
     public Alpha(){ 
       this.alpha = this; 
} 

Ahora usted puede llamar a la función en la clase Beta sólo por el uso de estas líneas:

new Alpha(); 
Alpha.alpha.DoSomethingAlpha(); 
Cuestiones relacionadas