Pregunta TypeScript Access Static Variables Using Instances


Entonces, en la mayoría de los lenguajes OOP, las variables estáticas también se pueden llamar clase variables, es decir, su valor es compartido entre todas las instancias de esta clase. Por ejemplo, en mi juego tengo una clase Bullet que se extiende por GreenBullet y PinkBullet. Quiero que estas subclases tengan una variable de "clase" o "estática" llamada ammo de modo que pueda realizar un seguimiento del recuento de municiones para ese tipo de munición específica. Pero aquí está el problema: quiero poder acceder a esta propiedad a través de una instancia de la subclase.

Ejemplo:

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

Quiero TODAS las instancias de GreenBullet Para estar al tanto de este cambio en su cuenta de municiones.


5
2018-05-23 00:36


origen


Respuestas:


La primera opción es crear accesos de instancia a la variable estática:

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

Si quieres todas las subclases de Bullet (Incluyéndose a sí mismo) para tener un conteo de municiones por separado, puedes hacerlo así:

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

En una nota lateral, estoy bastante seguro de que no deberías almacenar el conteo de balas en una variable estática.


10
2018-05-23 01:26