Subtyping là gì?

Noun Programming
subtype polymorphism inclusion polymorphism

Một số ngôn ngữ lập trình sử dụng ý tưởng về subtyping (còn được gọi là subtype polymorphism hoặc inclusion polymorphism) để hạn chế phạm vi kiểu có thể được sử dụng trong một trường hợp đa hình (polymorphism) cụ thể. Trong các ngôn ngữ này, subtyping cho phép một hàm (function) được viết để nhận một đối tượng (object) thuộc kiểu T nhất định, nhưng cũng hoạt động nếu truyền một đối tượng thuộc kiểu S là subtype của T (theo nguyên tắc thay thế Liskov) .

Trong ví dụ sau, chúng ta tạo các subtype cat và dog của animal. Thủ tục (procedure) letHear() chấp nhận một animal, nhưng cũng sẽ hoạt động chính xác nếu một subtype được truyền cho nó:


abstract class Animal {
    abstract String talk();
}

class Cat extends Animal {
    String talk() {
        return "Meow!";
    }
}

class Dog extends Animal {
    String talk() {
        return "Woof!";
    }
}

static void letsHear(final Animal a) {
    println(a.talk());
}

static void main(String[] args) {
    letsHear(new Cat());
    letsHear(new Dog());
}

Qua code trên ta thấy Cat là subtype của Animal và Animal là supertype của Cat. Nói một cách đơn giản hơn, Cat là một Animal nhưng Animal không phải là Cat. Về lý thuyết, điều này có nghĩa là tất cả các thao tác áp dụng cho kiểu dữ liệu Animal phải chấp nhận thao tác trên dữ liệu kiểu Cat; tuy nhiên, điều ngược lại là không đúng: các phép toán được định nghĩa cho kiểu dữ liệu Cat sẽ không thể hoạt động trên dữ liệu kiểu Animal một cách an toàn.

Learning English Everyday