¿Puede una clase extender dos clases?
Mi clase debe extender dos clases al mismo tiempo:
public class Preferences extends AbstractBillingActivity {
public class Preferences extends PreferenceActivity {
Cómo hacerlo?
Upd . Dado que esto no es posible, ¿cómo debo usar ese AbstractBillingActivity con Preferencias entonces?
Upd2 . Si voy con interfaces, debería crear:
-
BillingInterface
public interface BillingInterface extends PreferenceActivity, AbstractBillingActivity { }
-
PreferenceActivity
public interface PreferenceActivity { }
-
AbstractBillingActivity
public interface AbstractBillingActivity { void onCreate(Bundle savedInstanceState); }
Y luego
public class Preferences implements BillingInterface {
9 answers
Java no soporta herencia múltiple.
Hay algunas soluciones que se me ocurren:
La primera es la agregación: crea una clase que tome esas dos actividades como campos.
El segundo es usar interfaces.
El tercero es repensar tu diseño: ¿tiene sentido que una clase Preferences
sea a la vez una PreferenceActivity
y un AbstractBillingActivity
?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-05 19:09:54
Java no soporta herencia múltiple. Puede implementar varias interfaces, pero no extender varias clases.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-05 19:10:23
Otra solución es crear una clase interna privada que extienda la segunda clase.
por ejemplo, una clase que se extiende JMenuItem
y AbstractAction
:
public class MyClass extends JMenuItem {
private class MyAction extends AbstractAction {
// This class can access everything from its parent...
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-24 21:33:44
Java 1.8 (así como Groovy y Scala) tiene una cosa llamada "Interface Defender Methods", que son interfaces con cuerpos de métodos predeterminados predefinidos. Al implementar múltiples interfaces que usan métodos defender, podría efectivamente, de alguna manera, extender el comportamiento de dos objetos de interfaz.
También, en Groovy, usando la anotación @Delegate, puede extender el comportamiento de dos o más clases (con advertencias cuando esas clases contienen métodos del mismo nombre). Este código lo demuestra:
class Photo {
int width
int height
}
class Selection {
@Delegate Photo photo
String title
String caption
}
def photo = new Photo(width: 640, height: 480)
def selection = new Selection(title: "Groovy", caption: "Groovy", photo: photo)
assert selection.title == "Groovy"
assert selection.caption == "Groovy"
assert selection.width == 640
assert selection.height == 480
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-31 05:19:51
No no se puede hacer que una clase se extienda a dos clases.
Una posible solución es hacer que se extienda desde otra clase, y hacer que esa clase se extienda desde otra otra vez.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-05 19:10:53
Lo que estás preguntando es la herencia múltiple, y es muy problemático por varias razones. La herencia múltiple se evitó específicamente en Java; en su lugar, se optó por admitir la implementación de múltiples interfaces, que es la solución adecuada.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-05 19:12:23
Java no soporta herencia múltiple. Sin embargo, su problema puede ser resuelto usando interfaces.
La solución más fácil sería crear una interfaz para AbstractBillingActivity
y PreferenceActivity
e implementarlas ambas.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-24 21:38:46
Java no admite herencia múltiple, por eso no puede extender una clase de dos clases diferentes al mismo tiempo.
En su lugar, use una sola clase para extender desde, y use interfaces
para incluir funcionalidad adicional.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-05 19:12:25
Familiarizado con la jerarquía multinivel?
Puedes usar subclase como superclase para tu otra clase.
Puedes probar esto.
public class PreferenceActivity extends AbstractBillingActivity {}
Entonces
public class Preferences extends PreferenceActivity {}
En este caso, la clase Preferences hereda tanto PreferencesActivity como AbstractBillingActivity.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-19 08:32:31