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 ?

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):

namespace MyExample;

class Lock
{
    private $isLocked = false;

    public function unlock()
    {
        $this->isLocked = false;
        echo 'You unlocked the Lock';
    }
    public function lock()
    {
        $this->isLocked = true;
        echo 'You locked the Lock';
    }
    public function isLocked()
    {
        return $this->isLocked;
    }
}
//member 1
$aLock = new Lock();
$aLock->lock();

//member 2
$anotherLock = new Lock;
$anotherLock->unlock();

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 :slight_smile:

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

2 Likes

Tính đa hình sử dụng 2 kỹ thuật overloading và overriding

3 Likes

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ạ

public class Bird {
   //thiết kế class tổng quan của chim như ăn, ỉa, makeLove
}

public class Pigeon extends Bird {
   //thiết kế class chi tiết như gù, hót
}

//hình dáng 1, là chính nó
Pigeon bird1 = new Pigeon();

//nhưng cũng có thể chuyển sang hình dáng của chim
//và khi mang hình dáng của bố nó, thì nó chỉ dùng các tính năng mà bố nó qui định như ăn,ỉa, makeLove, không còn gù, ... giống như khi bạn thay mặt bố bạn đi làm gì đó ... thì phong thái của bạn phải là của bố.
Bird bird2 = new Pigeon();

//ngoài ra bạn cũng có ép kiểu (mình thấy dịch casting nên là đóng vai, chứ ai ép ai đek đâu
//tự mày muốn sang hình thái khác
Bird bird3 = (Bird) bird1;

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 …)

public class RichDad {
    void buildHouse(){
        //bố xây nhà để con thừa kế, tiết kiệm 20 năm cuộc đời con nhé
       //hy sinh đời bố củng cố đời con
   }
}

public class NaughtyBoy extends RichDad {
   @Override
   //nhớ là access modifier phải hoàng tráng hơn bố
   public void buildHouse(){
       //con đủ tài năng làm nhà to hơn nhé
       //con tài năng chứ éo phải hư đâu 
   }
}

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.

public class NaughtyBoy extends RichDad {
  //Overloading
   public void playGirl(){
       //random và noname
   }

  //Overloading
   public int playGirl(String hotgirl){
       //tên hotgirl
   }
}

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)

3 Likes

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ự.

2 Likes

Đa hình tĩnh: override, overload
Đa hình động dùng interface

1 Like

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ả.

1 Like

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)

2 Likes

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 :slight_smile:

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

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?