【问题标题】:TypeScript Access Static Variables Using InstancesTypeScript 使用实例访问静态变量
【发布时间】:2015-08-05 03:01:03
【问题描述】:

所以在大多数OOP 语言中,静态变量也可以称为 变量,即它们的值在该类的所有实例中共享。例如,在我的游戏中,我有一个类Bullet,它由GreenBulletPinkBullet 扩展。我希望这些子类有一个名为ammo 的“类”或“静态”变量,以便我可以跟踪该特定弹药类型的弹药数量。但这里有个问题:我希望能够通过子类的实例访问这个属性。

例子:

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

我希望GreenBullet 的所有实例都知道其弹药数量的这一变化。

【问题讨论】:

    标签: oop typescript


    【解决方案1】:

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

    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
    

    如果您希望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
    

    顺便说一句,我很确定您不应该将项目符号数存储在静态变量中。

    【讨论】:

    • 使用单独的静态成员的好技巧。你是如何让“this.constructor.ammo”编译的?投射到任何?
    • @MichaelS 那或做this.constructor["ammo"]。另外,我建议将static ammo 设为私有,因为不需要类外的任何东西来访问它。
    猜你喜欢
    • 1970-01-01
    • 2016-11-10
    • 2016-02-25
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2021-11-26
    • 2017-11-01
    相关资源
    最近更新 更多