2012-01-14 25 views
5

Tôi gặp sự cố lạ với PHP OOP và nhập gợi ý. Dưới đây là ví dụ:OOP PHP "Việc triển khai phải tương thích"

abstract class AC {} 

class C extends AC {} 

interface I { 
    function method(AC $abstract); 
} 

class InterfaceImplementation implements I { 
    function method(C $concrete) {} 
} 

Mã này sẽ không chạy, nói rằng method không tương thích với khai báo giao diện. Tôi nghĩ rằng nó tương thích kể từ khi C mở rộng AC - làm tôi bỏ lỡ một cái gì đó? Tôi dự kiến ​​sẽ triển khai loại chức năng này như thế nào?

+4

tôi sẽ không đồng ý đây là tương thích, 'bạn giao diện I' nghĩa một hợp đồng 'method' chấp nhận _any_' AC', không chỉ 'C' ... Tôi hết sức đồng mà' InterfaceImplementation' không trong thực tế triển khai 'I'. – Wrikken

Trả lời

4

Hãy tưởng tượng bạn có một lớp học B cũng mở rộng AC. Sau đó, I yêu cầu bất kỳ triển khai nào của nó cũng chấp nhận B làm đối số cho phương thức. Tuy nhiên, InterfaceImplementation của bạn thì không.

Ảnh lớn hơn: Bạn có thể muốn xem xét lại thiết kế của mình nếu bạn cần chỉ định loại cụ thể trong quá trình triển khai. Ý tưởng là với thế giới bên ngoài, tất cả những gì cần được biết là được mã hóa bởi AC và không nên có một InterfaceImplementation mà cần phải biết lớp con cụ thể nào đang được chuyển. Có lẽ các công cụ cụ thể có thể được nhúng vào mã của C và được gọi chung thông qua một phương pháp được hiển thị bởi AC?

Một bản cập nhật khác: Bạn có thể đạt được những gì bạn muốn sử dụng Generics, nhưng tôi không nghĩ rằng chúng tồn tại PHP. Tôi vẫn nghĩ rằng nếu bạn chia sẻ các chi tiết của vấn đề thiết kế mà có thể làm cho một câu hỏi thú vị :)

+1

Nó sẽ chấp nhận 'B''s .... Trừ khi bạn có nghĩa là' B' mở rộng 'AC', trong trường hợp bạn là chính xác. – Wrikken

+0

Tôi thấy, cảm ơn cho lời giải thích – Fluffy

+0

xin lỗi yea có nghĩa là để nói "extebs AC" không "mở rộng C" - cố định – Nicolas78

1

Chỉ cần xác định nó như là:

class InterfaceImplementation implements I { 
    function method(AC $concrete) {} 
} 

Và gọi nó với một thể hiện của C, tức là. ->method(new C());.

tham khảo Sổ tay PHP trên Object Interfaces nêu rõ:

Lớp thực hiện giao diện phải sử dụng chữ ký cùng một phương pháp chính xác như được định nghĩa trong giao diện. Không làm như vậy sẽ dẫn đến lỗi nghiêm trọng.

+0

yea nhưng tôi đoán anh ta muốn hạn chế InterfaceImplementation để chỉ chấp nhận đối số C – Nicolas78

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