Có đa kế thừa trong OOP PHP hoặc là các ngôn ngữ hổ trợ OOP khác?
Các bác cho e hỏi trong OOP trong PHP (hoặc các ngôn ngữ khác) có đa kế thừa không ạ. E thấy câu này hay hỏi phỏng vấn, các bác cho e xin câu tl )
3 CÂU TRẢ LỜI
Đa kế thừa bạn có thể hiểu đơn giản là một class có thể kế thừa từ nhiều hơn 1 class khác. Hiểu theo nghĩa này thì PHP, hay Java đều không hỗ trợ đa kế thừa (do khi khai báo class, bạn chỉ có thể extends
từ duy nhất 1 class khác). Ngôn ngữ OOP hỗ trợ đa kế thừa phổ biến nhất, thì có lẽ là C++ và Python.
Mặc dù không hỗ trợ việc kế thừa từ nhiều class cùng một lúc, nhưng PHP (hay Java) đi theo một cách khác để hỗ trợ một vài tính chất của đa kế thừa, thông qua Interface (một class có thể implements
nhiều hơn 1 Interface
). Ngoài ra PHP còn có khái niệm Trait
, cũng có thể sử dụng để thể hiện một vài tính chất của đa kế thừa. Nhưng về cơ bản, thì nó vẫn khác với khái niệm đa kế thừa được thể hiện trên C++ hay Python
Tks bác nhiều, e vừa upvote cho bác ạ
@duongricky Cám ơn bạn
Thực ra bản chất của OOP không mô tả hay quy định việc có được đa kế thừa hay không. Còn việc các ngôn ngữ có đa kế thừa hoặc không có là do chủ đích của người thiết kế ngôn ngữ. Ví dụ nếu cho phép đa kế thừa, rất nhiều ông lập trình viên sẽ kế thừa theo kiểu: Son extends Father, Mother. Cả Father và Mother đều có method là reproduction() nhưng Father sẽ có hành vi khác với Mother. Điều này sẽ sinh ra lúng túng. Thành ra các ông ấy hạn chế luôn bằng cách không cho phép đa kế thừa trên class và chuyển đa kế thừa sang Interface, tức chỉ kế thừa về mặt giao diện hành vi, còn thằng con thích thể hiện hành vi của nó như thế nào thì nó tự quyết định. Ví dụ thay vì nó sinh sản bằng cách thụ tinh, thì có có thể cắt phéng đi, rồi lắp tử cung nhân tạo để đẻ như phụ nữ. Trong thiết kế hướng đối tượng, người ta cũng khuyên là không nên dùng kế thừa mà dùng kết hợp (composition) trong những trường hợp phức tạp. Ví dụ như 100 Class con cùng loại nhưng cùng 1 hành vi (method) lại có kết quả khác nhau. Nếu dùng Interface, nó có thể dẫn đến việc duplicate code, vì bạn phải viết lại cùng 1 hành vi quá nhiều lần.
upvote cho bác nhé mà sao avatar bác kỳ quặc thế
@duongricky À, chụp bằng app của Facebook ấy.
PHP không có đa kế thừa nha bạn. Nhưng bạn có thể sử dụng Trait, nó sẽ hỗ trợ 1 vài thứ giống như đa kế thừa
upvote cho bác nhé