Stack Overflow en español Asked on November 24, 2021
hola comunidad de desarrolladores, quiero implementar un mismo método en dos clases anónimas para ahorrarme escribir varias veces este método, el algoritmo es un poco mas complejo pero quiero dar un ejemplo con este:
public class MainActivity extends AppCompatActivity {
interface $miinterfaz{
void primero(Integer entero);
void segundo();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
$miinterfaz inter1=new $miinterfaz(){//primera clase anónima
@Override
public void primero(Integer entero) {
int nuevoentero=entero+10;//aca solo le sumo 10
Log.i("este metodo cambia","entero = "+nuevoentero);
}
@Override
public void segundo() {
Log.i("este metodo es el mismo","solo quiero imprimir este mensaje");//este mensaje es igual en los dos casos
}
};
$miinterfaz inter2=new $miinterfaz(){//segunda clase anónima
@Override
public void primero(Integer entero) {
int nuevoentero=entero+50;//aquí es diferente el calculo sumándole 50
Log.i("este metodo cambia","entero = "+nuevoentero);
}
@Override
public void segundo() {
Log.i("este metodo es el mismo","solo quiero imprimir este mensaje");
}
};
ejecutar(inter1);
ejecutar(inter2);
}
public void ejecutar($miinterfaz inter){
inter.primero(8);
inter.segundo();
}
}
entonces la pregunta es ¿como copio el segundo método en la otra clase anónima? o si existe otra técnica para evitar escribir varias veces este método pero teniendo en cuenta que el primero si cambia
asi queda el log:
I/este metodo cambia: entero = 18
I/este metodo es el mismo: solo quiero imprimir este mensaje
I/este metodo cambia: entero = 58
I/este metodo es el mismo: solo quiero imprimir este mensaje
utilizando una clase interna e implementando la interfaz pude dejar sobreescrita(override) la función que no es dinámica y cambiarla que si en cada instancia
public class MainActivity extends AppCompatActivity {
interface $miinterfaz{
void primero(Integer entero);
void segundo();
}
// clase que implementa el método -> NombreClase.java
class nuevaclase implements $miinterfaz {
@Override
public void primero(Integer entero) {
//este metodo se sobreescribe
}
@Override
public void segundo() {
Log.i("este metodo es el mismo","solo quiero imprimir este mensaje");
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
$miinterfaz inter1=new nuevaclase(){
@Override
public void primero (Integer entero){
int nuevoentero = entero + 10;
Log.i("este metodo cambia", "entero = " + nuevoentero);
}
};
$miinterfaz inter2=new nuevaclase(){
@Override
public void primero (Integer entero){
int nuevoentero = entero + 50;
Log.i("este metodo cambia", "entero = " + nuevoentero);
}
};
$miinterfaz inter3=new nuevaclase(){
@Override
public void primero (Integer entero){
int nuevoentero = entero + 98;
Log.i("este metodo cambia", "entero = " + nuevoentero);
}
};
$miinterfaz inter4=new nuevaclase(){
@Override
public void primero (Integer entero){
int nuevoentero = entero + 40;
Log.i("este metodo cambia", "entero = " + nuevoentero);
}
};
ejecutar(inter1);
ejecutar(inter2);
ejecutar(inter3);
ejecutar(inter4);
}
public void ejecutar($miinterfaz inter){
inter.primero(8);
inter.segundo();
}
}
este es el log
I/este metodo cambia: entero = 18
I/este metodo es el mismo: solo quiero imprimir este mensaje
I/este metodo cambia: entero = 58
I/este metodo es el mismo: solo quiero imprimir este mensaje
I/este metodo cambia: entero = 106
I/este metodo es el mismo: solo quiero imprimir este mensaje
I/este metodo cambia: entero = 48
I/este metodo es el mismo: solo quiero imprimir este mensaje
Answered by junior on November 24, 2021
Lo que crea la necesidad de hacer dos instancias solamente es el valor del incremento. Si se pasa el incremento como un parámetro de la función primero()
no se necesitan dos instancias diferentes.
interface $miinterfaz{
void primero(Integer entero, Integer incremento);
void segundo();
}
Crear una sola instancia
$miinterfaz inter1 = new $miinterfaz(){
@Override
public void primero(Integer entero, Integer incremento) {
int nuevoentero =entero + incremento;
}
@Override
public void segundo() {
Log.i("este metodo es el mismo","solo quiero imprimir este mensaje");
}
};
Answered by Lobos on November 24, 2021
Dado que las interfaces solo son las firmas de los métodos, y lo que requieres es la implementación de un método. Lo que yo haría sería una clase que implemente una interfaz con el método requerido y ahí escribiría la implementación del método. De esa manera me evitaría estar sobreescribiendo el método de la interfaz cada que la use.
// miinterfaz.java
interface $miinterfaz {
void segundo();
}
// clase que implementa el método -> NombreClase.java
class NombreClase implements $miinterfaz {
@Override
private segundo() {
// El código que vas a llamar varias veces va aquí
}
}
//en el MainActivity
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
$miinterfaz miinterfaz = new NombreClase();
miinterfaz.segundo();
}
}
Espero haberme dado a entender.
Answered by user2028118 on November 24, 2021
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP