2011-09-01 22 views
32

È possibile in PHP che una classe astratta erediti da una classe astratta?classe astratta php che estende un'altra classe astratta

Per esempio,

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? non dà una risposta)

+1

Avete effettivamente eseguito il codice prima di chiedere qui? – Yoshi

+0

@Jakub penso che sia possibile a mia conoscenza – Exhausted

+1

Sì. Non ha funzionato. Perché ... di 'funzione pubblica astratta b();' nella seconda classe. Senza di esso va. Domanda risposta –

risposta

35

Sì, questo è possibile.

Se una sottoclasse non implementa tutti i metodi astratti della superclasse astratta, deve essere anch'essa astratta.

+1

senza 'funzione pubblica astratta b();' nella seconda classe funziona ... risposta, grazie –

+0

Nota che l'ordine delle definizioni è importante. Se si mette prima la classe VeryConcrete, si otterrà l'errore "Errore irreversibile: Classe" MoreConcrete "non trovato". Fai attenzione a non mettere il carrello astratto davanti al cavallo. – RightHandedMonkey

5

sì è possibile comunque il codice non avrebbe funzionato se si chiama $VeryConcreteObject->b()

Here è la spiegazione più dettagliata.

3

Funzionerà, anche se si lascia la funzione astratta b(); in classe MoreConcrete.

Ma in questo esempio specifico trasformerei la classe "Generico" in un'interfaccia, poiché non ha più implementazione accanto alle definizioni del metodo.

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(); } 
}