2015-07-06 13 views
5

tôi đã trở thành một chút nhầm lẫn về lớp trừu tượng! tôi đã đọc nhiều hơn các bài viết được viết trong stackoverflow và một trang web khác nhưng tôi đã không hiểu! vì vậy tôi đã xem lại cuốn sách của mình nhưng tôi cũng không hiểu nó. vì vậy hãy phân tích mã bên dưới từng bước:Phân tích lớp trừu tượng trong php

cảm ơn trước

<?php 
abstract class AbstractClass 
{ 
abstract protected function getValue(); 
public function printOut() { 
print $this->getValue(); 
} 
} 
class ConcreteClass1 extends AbstractClass 
{ 
protected function getValue() { 
return "ConcreteClass1"; 
} 
} 
class ConcreteClass2 extends AbstractClass 
{ 
protected function getValue() { 
return "ConcreteClass2"; 
} 
} 
$class1 = new ConcreteClass1; 
$class1->printOut(); 

$class2 = new ConcreteClass2; 
$class2->printOut(); 
?> 

Trả lời

2

Theo định nghĩa

'Một lớp trừu tượng là một lớp được khai báo -nó trừu tượng có thể có hoặc không bao gồm các phương pháp trừu tượng. Các lớp trừu tượng không thể được khởi tạo, nhưng chúng có thể được phân lớp. Một phương thức trừu tượng là một phương thức được khai báo mà không cần triển khai '.

Nếu được xác định là lớp trừu tượng, bạn nên mở rộng lớp đó với lớp khác. Trong trường hợp có các phương thức trừu tượng trong lớp trừu tượng, bạn nên viết chúng trong lớp con để khởi tạo con.

liên quan đến mã, đó là lý do tại sao khi bạn nhanh chóng ConcreteClass, hàm getValue là 'ghi đè' để mô hình, trong khi gọi đến các phương pháp in là từ cha mình, bởi vì Người ta đã viết và không ghi đè bởi đứa trẻ. (Xem thêm phương pháp đó không trừu tượng, đó là lý do tại sao bạn cũng có thể sử dụng nó từ lớp cha)

+0

cảm ơn lời giải thích tuyệt vời của bạn! nhưng chỉ một điều thôi! Chúng ta có viết "hàm getValue();" để nói rằng hàm này không có ở đây (trong lớp cha). nó thuộc về lớp mở rộng.?! vì vậy bất cứ khi nào chúng ta gọi hàm "printOut" từ lớp mở rộng, và hàm bao gồm "print $ this-> getValue();" nó đã tìm kiếm hàm getValue trong AbstractClass nhưng vì chúng ta đã viết "hàm getValue();" nó tìm kiếm nó trong lớp mở rộng! Tôi có đúng không? – mehdi

+0

Khi gọi một lớp nếu đứa trẻ không có lớp được thực hiện, thường là sau khi đi đến người cha. Nếu bạn áp dụng logic đó, bạn sẽ hiểu rằng khi phương thức getValue bị ghi đè (trong trường hợp này, nếu bạn không thể sử dụng một lớp có phương thức trừu tượng không được thực hiện) khi gọi printOut của người cha, nó sẽ tự động trả về giá trị của đứa trẻ. Hy vọng nó đã giúp! –

+0

thực sự đã giúp tôi! cảm ơn Marcos! – mehdi

1

Mã của bạn là đúng. Abstact lớp có nghĩa là, khi bạn không thể làm cho một ví dụ của nó. Bạn không thể làm điều này:

$abstract = new AbstractClass(); 
+0

cảm ơn nhưng sth làm tôi bối rối! nghĩa là chúng ta viết "hàm getValue();" để nói rằng hàm này không có ở đây (trong lớp cha). nó thuộc về lớp mở rộng.?! vì vậy bất cứ khi nào chúng ta gọi hàm "printOut" từ lớp mở rộng, và hàm bao gồm "print $ this-> getValue();" nó đã tìm kiếm hàm getValue trong AbstractClass nhưng vì chúng ta đã viết "hàm getValue();" nó tìm kiếm nó trong lớp mở rộng! Tôi có đúng không? – mehdi

+0

Nếu ở trẻ xác định 'getValue()' bạn mỗi khi ghi đè lên một tên cùng một phương thức cha mẹ, ngay cả khi nó là phương thức trừu tượng. Phương thức trừu tượng được khai báo chỉ nói cho nhà phát triển, khi anh ta có trong phương thức xác định con có cùng tên và tham số. Lớp trừu tượng với các phương thức trừu tượng gần giống như 'giao diện'. – Daniel

Các vấn đề liên quan