2015-01-19 14 views
7

Khái niệm tôi đang nghĩ đến xuất phát từ giao diện Traversable. Giao diện này không thể được triển khai trực tiếp, nhưng thay vào đó là thỏa mãn bằng cách thực hiện một giao diện mở rộng nó.PHP có triển khai tiếp xúc cho các giao diện trừu tượng không?

Tôi có thể tuyên bố giao diện không thể triển khai và thay vào đó mở rộng với giao diện công khai không?

Chỉnh sửa: Tôi nhận thấy khả năng sẽ là vô nghĩa vì nó có thể bị phá vỡ bởi bên thứ ba tạo giao diện có thể mở rộng giao diện cơ sở. Tôi đang tìm một cách rõ ràng hơn để thể hiện tính đa hình.

Ví dụ:

abstract interface Vehicle 
{ 
} 

interface Car extends Vehicle 
{ 
    public function drive(RouteProvider $routeProvider, $speed) 
} 

interface Boat extends Vehicle 
{ 
    public function sail(BodyOfWater $water, $heading); 
} 

class PeopleMover 
{ 
    public function move(Vehicle $vehicle) 
    { 
     if ($vehicle instanceof Boat) { 
      // move people across bodies of water 
     } elseif ($vehicle instanceof Car) { 
      // move people along roads 
     } 
    } 
} 
+1

Không, nhưng bạn có thể không chỉ tuyên bố một giao diện trống 'Xe' trống rỗng và đạt được điều tương tự không? Bạn đang dựa vào các bên thứ ba không mở rộng/thực hiện nó anyway. –

+1

ví dụ lạ. tại sao bạn không đưa ra một tên chung cho các phương pháp? –

+0

@KarolyHorvath vì ví dụ này khá đơn giản, các phương thức sẽ có các đối số bắt buộc khác nhau. ví dụ. phương thức 'drive' có thể cần một dịch vụ khám phá tuyến và phương thức' sail' có thể cần biết cơ thể của nước. Hai đối tượng trong ví dụ của tôi có thể quá gần để thể hiện những gì tôi làm. 'Traversable' với' Iterator' và 'IteratorAggregate' là những gì tôi muốn đạt được khi họ làm những việc khác nhau nhưng có thể đạt được kết quả tương tự nếu bạn biết những gì bạn đang làm việc. –

Trả lời

1

Mục đích của giao diện là để xác định làm thế nào một ứng dụng truy cập đối tượng của bạn, chứ không phải kiểm soát cách các đối tượng được xác định. Đó là cách để đối tượng của bạn nêu rõ ứng dụng, "Tôi triển khai giao diện này, vì vậy bạn có thể tin tưởng tôi có các phương pháp này".

Nếu bạn muốn kiểm soát cách đối tượng được xác định, bạn nên sử dụng lớp trừu tượng với phương pháp trừu tượng.

+0

I ' m không cố gắng kiểm soát cách nó được xác định, đó là lý do tại sao tôi muốn sử dụng một giao diện. Tuy nhiên tôi muốn tuyên bố rằng phương pháp của tôi chấp nhận các mục tương tự làm những việc khác nhau/yêu cầu các loại đối số khác nhau để đạt được mục tiêu cuối cùng. đa hình trong một nutshell ... tôi sẽ thực hiện điều này hoặc điều đó, họ không làm điều tương tự ... nhưng tôi có thể làm cho họ làm việc để đạt được kết quả tương tự –

+0

Tôi nghĩ rằng bạn là hơi off theo dõi với đa hình. Dựa trên ví dụ của bạn, thay vì có Car :: drive() và Boat :: sail(), bạn sẽ có Vehicle :: transport(), với Car and Boat có thực hiện riêng của họ. Cả hai cần cùng một phương thức chữ ký cho phương thức transport(), vì vậy một tham số sẽ có kiểu Route, và sau đó bạn sẽ mở rộng nó để bao gồm RouteByRoad và RouteByWater. – user2045006

+0

Đó là một tuyên bố chính xác cho 'đa hình bao gồm' hay còn gọi là' phân nhóm'. Khi thảo luận về ý định thực hiện của tôi như là một phương tiện của quá tải hàm mà không có 'đa hình tham số', nó sẽ là' đa hình ad-hoc' mà 'subtyping' không nhất thiết là một kích thước phù hợp với mọi giải pháp. Bằng cách sử dụng ví dụ của tôi, 'Xe' không phải là phương tiện chịu trách nhiệm cho việc vận chuyển,' PeopleMover' là, và các yêu cầu khác nhau cho các phương tiện vận tải khác nhau khác nhau. Ngoài ra, tôi sẽ không muốn triển khai 'Chauffer' để nghĩ rằng nó có thể bay một 'Máy bay' chỉ vì cả hai đều có thể vận chuyển. –

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