为什么无法从类实例访问静态字段?

问题描述 投票:3回答:1

根据我的理解,静态成员属于该类,而不属于该类的特定实例。如果所有实例共享具有完全相同值的特定特征,或者如果我根本不想创建该类的任何实例,则它可能是有用的。

所以,如果我有一个类Car,并且我的所有汽车将总是有4个轮子,我可以将轮子的数量存储为类Car的静态成员,而不是作为myCar类实例的实例变量。

但是为什么在Haxe中不可能从类实例访问静态变量?对我没有任何意义。

class Car 
{ 
    public static var noOfWheels:Int = 4;

    public static function getNoOfWheels():Int
    {       
        return Car.noOfWheels;
    }   

}

class Main
{
    static function main() 
    {
        myCar = new Car();

        trace (myCar.noOfWheels);
        trace (myCar.getNoOfWheels());
        trace (Type.getClass(myCar).noOfWheels);
    }
}

这些痕迹都不会导致期望的结果。第一个和第二个跟踪导致类型错误:

无法从类实例访问静态字段XY

而第三个导致:

Class <Car>没有字段noOfWheels

编辑以澄清:

我有几个Car类的子类,继承了它的所有属性。在某些情况下,像类ItalianVan,我再次声明静态变量noOfWheels,从而使原来的Car.noOfWheels黯然失色。

class ItalianVan extends Car 
{ 
    public static var noOfWheels:Int = 3;
}   

现在,如果我有一个任意的汽车实例,我想知道它有多少个轮子。如果我进入Car.noOfWheels,答案将永远是4个轮子,即使那辆特殊的车实际上是一辆三轮意大利面包车。

也许答案是:不要为这样的东西使用静态变量!但这对我来说并不明显。如果该类的所有成员具有相同数量的轮子,似乎没有必要使noOfWheels成为实例变量。

static-members haxe
1个回答
2
投票

我从未使用过Haxe,但我可以看到你正在访问myCar变量。试试这个:

trace (Car.noOfWheels);
trace (Car.getNoOfWheels());

如果要访问静态变量,则应使用类名。

要从实例访问静态变量,您可以添加一个非静态方法来返回静态调用的结果。

© www.soinside.com 2019 - 2024. All rights reserved.