tôi sẽ sử dụng các ví dụ sau để minh họa cho câu hỏi của tôi:Có cách nào để xác định lại một gợi ý kiểu cho một lớp con cháu khi mở rộng một lớp trừu tượng không?
class Attribute {}
class SimpleAttribute extends Attribute {}
abstract class AbstractFactory {
abstract public function update(Attribute $attr, $data);
}
class SimpleFactory extends AbstractFactory {
public function update(SimpleAttribute $attr, $data);
}
Nếu bạn cố gắng chạy này, PHP sẽ ném một lỗi nghiêm trọng, nói rằng Declaration of SimpleFactory::update() must be compatible with that of AbstractFactory::update()
tôi hiểu chính xác những gì này có nghĩa là: Chữ ký phương thức SimpleFactory::update()
s phải khớp chính xác với lớp trừu tượng gốc của nó.
Tuy nhiên, câu hỏi của tôi: Có cách nào để cho phép phương pháp cụ thể (trong trường hợp này là SimpleFactory::update()
) để xác định lại gợi ý loại cho một hậu duệ hợp lệ của gợi ý ban đầu không?
Một ví dụ sẽ là instanceof
điều hành, trong đó sẽ trở thành sự thật trong trường hợp sau đây:
SimpleAttribute instanceof Attribute // => true
Tôi nhận ra rằng khi một công trình xung quanh, tôi có thể làm cho các loại gợi ý như nhau trong các phương pháp cụ thể, và thực hiện kiểm tra instanceof trong thân phương thức, nhưng có cách nào để thực thi điều này ở mức chữ ký không?
+1 Tôi rất muốn xem liệu điều này có khả thi hay không, mặc dù trong cuộc sống của tôi, tôi không thể hiểu được làm thế nào. Có lẽ PHP6 sẽ có hỗ trợ cải tiến cho phương thức nạp chồng và phát hiện nhiều phương thức * chữ ký *, vì vậy 'cập nhật hàm trừu tượng công cộng (Attribute $ attr, $ data)' và 'abstract abstract function update (SimpleAttribute $ attr, $ data)' có thể đồng tồn tại trong cùng một phạm vi lớp. – leepowers