Có cách nào để tắt tính đa hình (Polymorphism) trong Javascript hoặc Typescript không?

(Các bạn lưu ý: đây là mình nghiên cứu, chứ không phải hỏi trong dự án thực tế)
Cho đoạn code sau:

class A {
   abc() { console.log(1) }
}
class B extends A {
   abc() { console.log(2) }
}
let b = new B();
b.abc(); // => in ra 2
// typescript bắt đầu từ đây
let a = <A>b;
a.abc(); // => vẫn in ra 2

Làm thế nào để a.abc() in ra 1 nhỉ.

(<A>b).abc() in ra 2 đúng rồi mà?? Nguyên lý thứ 4 là cái gì??

Nếu làm trong C# thì nó in ra 1 đấy. Cái mình muốn đạt được là Polymorphism.
Ví dụ bên C#

public class A {
    public void abc() {
        Console.WriteLine("A");   
    }
}
public class B : A {
    public void abc() {
        Console.WriteLine("B");   
    }
}
public class Program {
    public static void Main(string[] args) {
        var b = new B();
        b.abc(); // in ra B
        var a = (A)b;
        a.abc(); // in ra A
    }
}

oh lâu ngày ko đụng tới C#, cái này đâu phải đa hình

cái này mới là đa hình trong C#:

While Java enables polymorphism by default, C# must invoke the “virtual” keyword in a base class and the “override” keyword in a derived class.

public class A {
    public virtual void abc() {
        Console.WriteLine("A");   
    }
}
public class B : A {
    public override void abc() {
        Console.WriteLine("B");   
    }
}
public class Program {
    public static void Main(string[] args) {
        var b = new B();
        b.abc(); // in ra B
        var a = (A)b;
        a.abc(); // in ra B
    }
}

OK mình nhầm lẫn tí, vậy trong trường hợp không có override với virtual thì làm thế nào để được như ví dụ của mình trên Typescript?

gu gồ xem làm thể nào để chặn polymorphism trong typescript thôi chứ ai biết đâu

đắng lòng:

A.prototype.abc.call(b); //in A

đành gọi thẳng hàm của A vậy

JS dzui lắm, data 1 nơi, function 1 nẻo.

1 Like

Thật ra theo implementation của C++ trong asm thì cũng data 1 nơi, function 1 nẻo :smiley:
P/s: Sửa lại title cho đúng.

1 Like

Không liên quan, bên java thì method là virtual by default, còn bên C# thì không như vậy.
Lý do:

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