2015-05-23 33 views
5

Vì vậy, trong hầu hết các ngôn ngữ OOP biến tĩnh cũng có thể được gọi lớp biến, tức là giá trị của họ là chia sẻ trong số tất cả các trường hợp của lớp này. Ví dụ: trong trò chơi của tôi, tôi có một lớp học Bullet được mở rộng thêm GreenBulletPinkBullet. Tôi muốn các lớp con này có biến "class" hoặc "static" được gọi là ammo để tôi có thể theo dõi số lượng đạn cho loại đạn cụ thể đó. Nhưng đây là bắt: Tôi muốn có thể truy cập thuộc tính này thông qua một thể hiện của lớp con.biến nguyên cảo Truy cập tĩnh Sử dụng Instances

Ví dụ:

var bullet: GreenBullet = new GreenBullet() 
if (bullet.ammo <= 0) 
    return; 
bullet.shoot(); 
bullet.ammo --; 

Tôi muốn tất cả các trường hợp của GreenBullet phải nhận thức được sự thay đổi này để đếm đạn của họ.

Trả lời

8

tùy chọn đầu tiên là để tạo accessors dụ để biến tĩnh:

class GreenBullet 
{ 
    static ammo: number = 0; 
    get ammo(): number { return GreenBullet.ammo; } 
    set ammo(val: number) { GreenBullet.ammo = val; } 
} 
var b1 = new GreenBullet(); 
b1.ammo = 50; 
var b2 = new GreenBullet(); 
console.log(b2.ammo); // 50 

Nếu bạn muốn tất cả các lớp con của Bullet (bao gồm cả bản thân) có đếm đạn riêng biệt, bạn có thể làm cho nó như vậy:

class Bullet 
{ 
    static ammo: number = 0; 
    get ammo(): number { return this.constructor["ammo"]; } 
    set ammo(val: number) { this.constructor["ammo"] = val; } 
} 
class GreenBullet extends Bullet { } 
class PinkBullet extends Bullet { } 

var b1 = new GreenBullet(); 
b1.ammo = 50; 
var b2 = new GreenBullet(); 
console.log(b2.ammo); // 50 
var b3 = new PinkBullet(); 
console.log(b3.ammo); // 0 

Trên một lưu ý phụ, tôi khá chắc chắn bạn không nên lưu trữ số lượng viên đạn trong một biến tĩnh.

+0

Bí quyết tuyệt vời với các thành viên tĩnh riêng biệt. Làm thế nào bạn có được "this.constructor.ammo" để biên dịch? chuyển sang Bất kỳ? – MichaelS

+1

@MichaelS hoặc thực hiện 'this.constructor [" ammo "]'. Ngoài ra, tôi sẽ đề nghị để làm cho 'tĩnh đạn' tư nhân vì không cần bất cứ điều gì bên ngoài lớp để truy cập nó. –

+0

Đã cập nhật câu trả lời với phiên bản miễn phí cảnh báo của trình biên dịch (như đã đề cập bởi @DavidSherret). – zlumer

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