2011-09-01 11 views
32

Czy to możliwe w PHP, że klasa abstrakcyjna dziedziczy z klasy abstrakcyjnej?php klasa abstrakcyjna rozszerzająca kolejną abstrakcyjną klasę

Na przykład

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? nie dać odpowiedź)

+1

Czy uruchomiłeś kod przed pytaniem tutaj? – Yoshi

+0

@Jakub Myślę, że to jest możliwe do mojej wiedzy – Exhausted

+1

Tak. Nie działało. Ponieważ ... z "abstrakcyjnej publicznej funkcji b();" w drugiej klasie. Bez niego to idzie. Pytanie odpowiedziało –

Odpowiedz

35

Tak, jest to możliwe.

Jeśli podklasa nie implementuje wszystkich abstrakcyjnych metod abstrakcyjnej nadklasy, również musi być abstrakcyjna.

+1

bez 'abstrakcyjnej funkcji publicznej b();' w drugiej klasie działa ... odpowiedział, dziękuję –

+0

Zauważ, że kolejność definicji ma znaczenie. Jeśli najpierw wpiszesz klasę "VeryConcrete", otrzymasz komunikat "Błąd krytyczny: klasa" Nie znaleziono "MoreBeton". Uważaj, aby nie umieścić abstrakcyjnego wózka przed koniem. – RightHandedMonkey

5

Jest to możliwe jednak Twój kod nie będzie działać, jeśli nazywa $VeryConcreteObject->b()

Here jest bardziej szczegółowe wyjaśnienie.

3

Będzie działać, nawet jeśli zostawisz funkcję abstrakcyjną b(); w klasie WięcejBeton.

Ale w tym konkretnym przykładzie przekształcę klasę "Generic" na Interface, ponieważ nie ma ona więcej implementacji poza definicjami metod.

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(); } 
} 
Powiązane problemy