使用实例的TypeScript访问静态变量

Nig*_*4de 7 oop typescript

因此,在大多数OOP语言中,静态变量也可以称为变量,即它们的值在此类的所有实例之间共享.例如,在我的游戏中,我有一个BulletGreenBullet和扩展的类PinkBullet.我希望这些子类具有一个"类"或"静态"变量,ammo以便我可以跟踪该特定弹药类型的弹药计数.但这里有一个问题:我希望能够通过子类的实例访问此属性.

例:

var bullet: GreenBullet = new GreenBullet()
if (bullet.ammo <= 0)
    return;
bullet.shoot();
bullet.ammo --;
Run Code Online (Sandbox Code Playgroud)

我希望所有实例都GreenBullet知道这些弹药数量的变化.

zlu*_*mer 12

第一个选项是创建静态变量的实例访问器:

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
Run Code Online (Sandbox Code Playgroud)

如果您希望Bullet(包括其自身)的所有子类具有单独的弹药计数,您可以这样做:

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
Run Code Online (Sandbox Code Playgroud)

另外,我很确定你不应该将子弹计数存储在一个静态变量中.