2011-09-01 41 views
32

Có thể trong PHP, một lớp trừu tượng kế thừa từ một lớp trừu tượng không?Lớp trừu tượng php mở rộng một lớp trừu tượng khác

Ví dụ,

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? không đưa ra một câu trả lời)

+1

Bạn có thực sự chạy mã trước khi hỏi tại đây không? – Yoshi

+0

@Jakub tôi nghĩ rằng có thể tối đa kiến ​​thức của tôi – Exhausted

+1

Có. Nó không hoạt động. Bởi vì ... của 'hàm trừu tượng công khai b();' trong lớp thứ hai. Nếu không có nó nó đi. Câu hỏi được trả lời –

Trả lời

35

Vâng, đây là có thể.

Nếu một lớp con không thực hiện tất cả các phương thức trừu tượng của lớp cha trừu tượng, nó cũng phải trừu tượng.

+1

mà không có 'hàm công khai trừu tượng b();' trong lớp thứ hai nó hoạt động ... được trả lời, cảm ơn –

+0

Lưu ý rằng thứ tự của các định nghĩa quan trọng. Nếu bạn đặt lớp VeryConcrete trước, bạn sẽ gặp lỗi 'Lỗi nghiêm trọng: Lớp' MoreConcrete 'không tìm thấy'. Cẩn thận đừng để chiếc xe trừu tượng trước con ngựa. – RightHandedMonkey

5

Có nó là có thể tuy nhiên mã của bạn sẽ không hoạt động nếu bạn gọi $VeryConcreteObject->b()

Here là lời giải thích chi tiết hơn.

3

Nó sẽ hoạt động, ngay cả khi bạn rời khỏi hàm trừu tượng b(); trong lớp MoreConcrete.

Nhưng trong ví dụ cụ thể này, tôi sẽ chuyển đổi lớp "Chung" thành Giao diện vì nó không thực hiện thêm bên cạnh định nghĩa phương thức.

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(); } 
} 
Các vấn đề liên quan