01/10/2018, 13:46

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

viết 15:47 ngày 01/10/2018

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

明玉 viết 15:50 ngày 01/10/2018

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
    }
}
viết 15:49 ngày 01/10/2018

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
    }
}
明玉 viết 16:02 ngày 01/10/2018

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?

viết 15:48 ngày 01/10/2018

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

viết 15:54 ngày 01/10/2018
stackoverflow.com
johni

Typescript polymorphism

javascript, typescript, polymorphism
asked by johni on 02:37PM - 22 Aug 16

đắ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.

明玉 viết 15:59 ngày 01/10/2018

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

cdxf viết 16:01 ngày 01/10/2018

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:

skolima.blogspot.com

Why aren't C# methods virtual by default?

Recently, during GeeCON 2012 conference, I had a very interesting conversation with Martin Skurla on differences between the .NET runtime ...

Bài liên quan
0