2011-09-01 24 views
32

¿Es posible en PHP que una clase abstracta herede de una clase abstracta?php clase abstracta extendiendo otra clase abstracta

Por ejemplo,

abstract class Generic { 
    abstract public function a(); 
    abstract public function b(); 
} 

abstract class MoreConcrete extends Generic { 
    public function a() { do_stuff(); } 
    abstract public function b(); // I want this not to be implemented here... 
} 

class VeryConcrete extends MoreConcrete { 
    public function b() { do_stuff(); } 

} 

(abstract class extends abstract class in php? no da una respuesta)

+1

¿Has ejecutado el código antes de preguntar aquí? – Yoshi

+0

@Jakub creo que es posible hasta mi conocimiento – Exhausted

+1

Sí. No funcionó. Porque ... de 'función pública abstracta b();' en la segunda clase. Sin eso, va. Pregunta respondida –

Respuesta

35

Sí, esto es posible.

Si una subclase no implementa todos los métodos abstractos de la superclase abstracta, también debe ser abstracta.

+1

sin 'función pública abstracta b();' en la segunda clase funciona ... respondió, gracias –

+0

Tenga en cuenta que el orden de las definiciones es importante. Si coloca la clase VeryConcrete primero, obtendrá el error 'Fatal error: Class' MoreConcrete 'not found'. Tenga cuidado de no colocar el carro abstracto antes del caballo. – RightHandedMonkey

5

Sí, es posible, sin embargo su código no funcionaría si se llama a $VeryConcreteObject->b()

Here es la explicación más detallada.

3

Funcionará, incluso si deja la función abstracta b(); en la clase MoreConcrete.

Pero en este ejemplo específico transformaría la clase "Genérica" ​​en una interfaz, ya que no tiene más implementación junto a las definiciones de métodos.

interface Generic { 
    public function a(); 
    public function b(); 
} 

abstract class MoreConcrete implements Generic { 
    public function a() { do_stuff(); } 
    // can be left out, as the class is defined abstract 
    // abstract public function b(); 
} 

class VeryConcrete extends MoreConcrete { 
    // this class has to implement the method b() as it is not abstract. 
    public function b() { do_stuff(); } 
}