¿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:

  1. BillingInterface

    public interface BillingInterface extends PreferenceActivity, AbstractBillingActivity {
    
    }
    
  2. PreferenceActivity

    public interface PreferenceActivity {
    
    }
    
  3. AbstractBillingActivity

    public interface AbstractBillingActivity {
    
            void onCreate(Bundle savedInstanceState);
    
    }
    

Y luego

public class Preferences implements BillingInterface {
Author: Asad Rasheed, 2011-07-05

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?

 40
Author: Etienne de Martel,
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.

 22
Author: Mat,
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...
    }

}
 10
Author: Jonny Rimkus,
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
 7
Author: djangofan,
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.

 4
Author: Jules,
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.

 1
Author: Paul Sonier,
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 PreferenceActivitye implementarlas ambas.

 1
Author: nejckorasa,
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.

 0
Author: MD Sayem Ahmed,
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.

 0
Author: AyukNayr,
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