2012-10-29 63 views
58

Xem ví dụ thừa kế từ sân chơi trên trang web nguyên cảo:nguyên cảo truy cập thành viên của lớp cơ sở

class Animal { 
    public name; 
    constructor(name) { 
     this.name = name; 
    } 
    move(meters) { 
     alert(this.name + " moved " + meters + "m."); 
    } 
} 

class Snake extends Animal { 
    constructor(name) { super(name); } 
    move() { 
     alert("Slithering..."); 
     super.move(5); 
    } 
} 

class Horse extends Animal { 
    constructor(name) { super(name); } 
    move() { 
     alert(super.name + " is Galloping..."); 
     super.move(45); 
    } 
} 

var sam = new Snake("Sammy the Python") 
var tom: Animal = new Horse("Tommy the Palomino") 

sam.move() 
tom.move(34) 

tôi có thay đổi một dòng mã: cảnh báo trong Horse.move(). Ở đó tôi muốn truy cập "super.name", nhưng nó chỉ trả về không xác định. Intellisense gợi ý rằng tôi có thể sử dụng nó và TypeScript biên dịch tốt, nhưng nó không hoạt động. Bất kỳ ý tưởng nào?

Trả lời

97

Ví dụ hoạt động. Ghi chú bên dưới.

class Animal { 
    constructor(public name) { 
    } 

    move(meters) { 
     alert(this.name + " moved " + meters + "m."); 
    } 
} 

class Snake extends Animal { 
    move() { 
     alert(this.name + " is Slithering..."); 
     super.move(5); 
    } 
} 

class Horse extends Animal { 
    move() { 
     alert(this.name + " is Galloping..."); 
     super.move(45); 
    } 
} 

var sam = new Snake("Sammy the Python"); 
var tom: Animal = new Horse("Tommy the Palomino"); 

sam.move(); 
tom.move(34); 
  1. Bạn không cần phải tự gán tên cho một biến nào. Sử dụng public name trong định nghĩa hàm tạo sẽ thực hiện điều này cho bạn.

  2. Bạn không cần gọi số super(name) từ các lớp học chuyên biệt.

  3. Sử dụng this.name hoạt động.

Lưu ý khi sử dụng super.

Điều này được trình bày chi tiết hơn trong phần 4.8.2 của đặc tả ngôn ngữ.

Hành vi của các lớp kế thừa từ Animal không khác với hành vi ở các ngôn ngữ khác. Bạn cần chỉ định từ khóa super để tránh nhầm lẫn giữa chức năng chuyên biệt và hàm lớp cơ sở. Ví dụ: nếu bạn gọi là move() hoặc this.move(), bạn sẽ xử lý chức năng Snake hoặc Horse chuyên dụng, do đó, sử dụng hàm super.move() gọi hàm cơ bản một cách rõ ràng.

Không có sự nhầm lẫn về thuộc tính vì chúng là thuộc tính của cá thể. Không có sự khác biệt giữa super.namethis.name - chỉ đơn giản là this.name. Nếu không, bạn có thể tạo ra một con ngựa có tên khác nhau tùy thuộc vào việc bạn đang ở trong lớp chuyên biệt hay lớp cơ sở.

+0

Câu trả lời hay và cảm ơn tham chiếu đến đặc tả ngôn ngữ. Bạn có biết bất kỳ tài liệu nào về lý do tại sao, ví dụ, các trình truy cập thuộc tính lớp cơ sở không được ảo hóa và có thể truy cập thông qua các trình truy cập ghi đè trong lớp dẫn xuất (như các phương thức) không? –

+0

Phần 4.8 bao gồm tất cả mọi thứ đã được viết xuống cho đến nay - nó có xu hướng là một "đây là hành vi", mặc dù chứ không phải là "đây là lý do tại sao". – Fenton

+2

Cảm ơn Steve Fenton. Tôi cũng chỉ tình cờ gặp một cuộc thảo luận tương tự ở đây: https://typescript.codeplex.com/discussions/418349. Dường như là sự mất cân bằng trong ngôn ngữ; tôi đoán là quyết định đã được thực hiện để giữ JavaScript được phát ra đơn giản, trái ngược với các phương thức trợ giúp "work-around" để bù đắp cho việc thiếu sự hỗ trợ JavaScript. –

Các vấn đề liên quan