2011-07-05 27 views
48

Mi clase debe extenderse dos clases al mismo tiempo:¿Puede una clase extender dos clases?

public class Preferences extends AbstractBillingActivity { 

public class Preferences extends PreferenceActivity { 

Cómo hacerlo?

Upd. Como 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 { 
+0

No puede: http://www.javaworld.com/javaworld/javaqa/2002-07/02-qa-0719-multinheritance.html –

+1

@LA_: una clase puede implementar múltiples interfaces pero solo extiende una clase , para que pueda implementar su clase con todas sus interfaces sin fusionar todo en una interfaz, si lo desea. –

+0

Una vez que haya creado AbstractBillingActivity y PreferenceActivity como interfaces, no necesita crear otra interfaz llamada BillingInterface. En lugar de utilizar este código: Preferencias clase pública implementa AbstractBillingActivity, PreferenceActivity – Logan

Respuesta

39

Java no soporta herencia múltiple.

Hay algunas soluciones que se me ocurren:

La primera es la agregación: hacer una clase que toma esas dos actividades como campos.

El segundo es usar interfaces.

La tercera es que replantearse su diseño: ¿tiene sentido para una clase Preferences ser a la vez un PreferenceActivity y un AbstractBillingActivity?

21

Java no es compatible con herencia múltiple. Puede implementar múltiples interfaces, pero no extender múltiples clases.

+0

cómo debería usar esa AbstractBillingActivity (https://github.com/robotmedia/AndroidBillingLibrary) con preferencias a continuación? –

+1

No lo sé. A primera vista, no tiene sentido querer extender tanto algo llamado 'Preferences' como' BillingActivity' - No veo ningún enlace entre estos dos. Use la composición si sus preferencias necesitan almacenar algo de actividad de facturación o viceversa. – Mat

+0

¿dónde puedo leer acerca de la composición? Esto es algo nuevo para mi. O bien, ¿podría publicar un ejemplo? Gracias. –

4

No, no 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 que la clase se extienda desde otra vez.

+1

¿Podemos realmente lograr el objetivo mencionado con este enfoque? Si es tan bueno saberlo –

1

Lo que está preguntando es herencia múltiple, y es muy problemático por varias razones. La herencia múltiple se evitó específicamente en Java; la elección fue hecha para soportar la implementación de múltiples interfaces, en cambio, que es la solución apropiada.

+0

Tengo una pregunta para usted .. Creo que existe herencia múltiple en Java. Permítanme explicarlo Clase A Clase B. La Clase A extiende la Clase B y la Clase A también extiende la Clase de objeto. entonces, ¿cómo podemos decir que java no admite la herencia múltiple ... –

0

Java no admite herencia múltiple, es por eso que no puede extender una clase de dos clases diferentes al mismo tiempo.

En su lugar, utilice una única clase para extender y use interfaces para incluir funciones adicionales.

+0

podría consultar mi pregunta, upd2? Nunca trabajé con interfaces antes. –

7

Java 1.8 (así como Groovy y Scala) tiene una cosa llamada "Interface Defender Methods", que son interfaces con cuerpos de método predeterminado predefinidos.Al implementar múltiples interfaces que usan métodos de defensa, de una manera efectiva podría extender el comportamiento de dos objetos de interfaz.

Además, en Groovy, utilizando 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 
+1

Adición: Me retracto de esta respuesta: desde entonces, aprendí que la "composición de objetos" es probablemente lo que desea usar si necesita un comportamiento similar a la herencia múltiple. Además, la implementación de múltiples interfaces no sería como una herencia múltiple: no se puede tener una clase que implemente dos interfaces donde ambas interfaces contengan un método predeterminado con la misma firma a menos que la clase proporcione una implementación para ese método; por lo tanto, todavía tenemos efectivamente una herencia única. Siempre aprendiendo... – djangofan

8

Otra solución es crear una clase interna privada que amplíe 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... 
    } 

} 
1

Java no soporta herencia múltiple. Sin embargo, su problema puede resolverse usando interfaces.

La solución más fácil sería crear una interfaz para AbstractBillingActivity y PreferenceActivity e implementar ambas.

Cuestiones relacionadas