01/10/2018, 08:26
Tính đa hình sử dụng kĩ thuật gì
e đọc trên mạng có cái này :
TL: good… thế em cho anh biết 4 thuộc tính của OOP.
T: Dạ là tính đóng gói, tính đa hình, trìu tượng và kế thừa.
TL: Thế tính đa hình sử dụng kĩ thuật gì…
T: Kĩ thuật ý ạ…em không biết
chẳng phải đa hình thì dựa vào trìu tượng và kế thừa sao, ko biết đáp án như thế nào ?
Bài liên quan
Nếu nói tính đa hình sử dụng kỹ thuật là chưa đúng.
Vì một Class vốn nó đã có tính chất đa hình, nói đúng hơn đa hình là 1 trong những tính chất cơ bản của lạp trình OOP.
Ví dụ về tính đa hình (PHP):
Thì dễ thấy là member 1 khoá cửa nhà
Còn member 2 thì đóng cửa nhà
Vậy có nghĩa 1 Class cung cấp cho nhiều member và trạng thái của các member thì khác nhau, tính đa hình là thế thôi
khi chương trình chạy, một đối tượng nó sẽ biết nó thuộc lớp nào nên sẽ biết sử dụng phương thức của lớp nó, như vậy thì sẽ viết code ngắn hơn và khi phải thêm 1 lớp mới vào thì chỉ cần imlement không phải sửa code thì gọi là đa hình chứ bạn nói mh chẳng hiểu ?
Bạn nói đúng rồi, mình ví dụ trên là nằm trong một lớp duy nhất.
Ý bạn là nói đến nhiều lớp và diểm chung của mỗi lớp, điểm riêng của từng lớp. Minh hiểu ý bạn :)****
tự nhiên mh nghĩ ra rồi có lẽ kỹ thuật ở đây là ghi đè thôi :3
Tính đa hình sử dụng 2 kỹ thuật overloading và overriding
Một cái nữa là up-casting
Theo mình hiểu, tính đa hình không sử dụng hay dựa vào kỹ thuật gì cả, vì bản chất của OOP là như vậy. Poly trong tiếng Việt là nhiều, còn morphism là biến đổi sang các hình thái khác nhau. Thực ra PHP thì tính đa hình không rõ lắm, nên mình sẽ lấy Java minh hoạ
Còn override tính năng thường thấy trong đa hình.
Override (over tiếng Việt là quá, còn ride thì có thể gọi là đứng trên): đại khái giả sử bố bạn có cái nhà, muốn thừa kế cho bạn. giờ bạn không muốn mà tự xây thì override nó (nhớ là đã tự xây thì phải hoành tráng hơn, con hơn cha là nhà có phúc …)
Overload thì không phải đa hình. Nhiều dev nghĩ overload là đa hình dành cho function. Overload function có các chữ ký (signature / blue print) khác hẳn nhau.
Dùng overloading cho tiện thôi, chứ hoàn toàn có thể chuyển thành playGirlStreer và playGirlHot. Dev khi dùng không cần nhớ quá chi tiết, vì Java tự hiểu cần chọn hàm nào (hai hàm khá cùng mục đích, đặt 2 tên dễ confuse). Overloading chẳng liên quan gì tới tính đa hình cả.
p/s: casting (mình nghĩ nên dịch là đóng vai)
overloading (nạp song song)
Override: Có thể hiểu là “vượt mặt” do subclass có internal khác superclass.
Cast: Hay dịch là “ép (kiểu)” tức là ép nó vào một cái “khuôn” nào đó. Từ này trong tiếng Anh cũng có ý tương tự.
Đa hình tĩnh: override, overload
Đa hình động dùng interface
Trong phim ảnh thì casting là dùng cho trong vai, còn nếu ở game thì khi mình cast 1 phép thuật là biến 1 ai đó sang thành con gì đó. Chưa thấy ai dùng là ép cả.
Mình thấy khái niệm static và dynamic polymorphism này của C củ chuối vãi (vì trước kia nó không có khái niệm class). Thực ra tĩnh là override, và động là overload. Động vì khi chạy thì nó mới tự quyết định xem dùng function nào trong cái đống function cùng tên kia. Cái này gọi là đa hình cho function (có từ thời procedure)
Còn vụ đa hình cho class thì làm gì có khái niệm đa hình động là interface nhỉ. Vì kể cả bạn chưa quyết định chọn class gì truyền vào, nhưng khi bạn truyền thì bạn phải truyền 1 object cụ thể (lúc này đâu cần JVM lựa chọn đâu)
overload là method cùng tên nhưng khác kiểu dữ liệu truyền vào, vậy làm sao gọi là đa hình được @_@
Cái đó là khái niệm chung.
Swap lại mới đúng bạn
vì sao gọi nó là đa hình động vì lời gọi hàm sẽ chỉ được kết nối (binding) ở thời điểm thực thi runtime thôi , còn đa hình tĩnh thì lời gọi hàm nó đã được xác định thời điểm biên dịch compiler , nên nói overriding đa hình tĩnh là sai , còn đa hình động dùng inteface ?? class vẫn dùng đc abstract class vẫn dùng được ??
Chắc ý thớt hỏi là dựa vào kĩ thuật gì thì OOP mới có khả năng thực hiện tính chất đa hình. Còn overload, override chỉ là những thứ đi kèm để thể hiện tính chất đa hình thôi.
:v nhớ mang máng của ducky nói vậy