【问题标题】:Why is it not possible to access a static field from a class instance?为什么不能从类实例访问静态字段?
【发布时间】:2015-07-30 12:44:23
【问题描述】:

在我的理解中,静态成员属于类而不是该类的特定实例。如果所有实例都以完全相同的值共享此特定特征,或者我根本不想创建该类的任何实例,这将很有用。

所以,如果我有一个类 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

而第三个导致:

类 没有字段 noOfWheels

编辑澄清:

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

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

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

也许答案是:不要对这样的东西使用静态变量! 但我不清楚为什么。 如果该类的所有成员具有相同数量的轮子,则似乎没有必要将 noOfWheels 设为实例变量。

【问题讨论】:

    标签: static-members haxe


    【解决方案1】:

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

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

    当你想访问一个静态变量时,你应该使用类名。

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

    【讨论】:

    • 这是正确的:在 Haxe 中,像大多数其他语言一样,静态变量必须从类名而不是实例名访问。
    • 感谢您的意见。但是如果我不知道类名怎么办?
    • 通常有 getClass 或 instanceOf 这样的方法可以让你知道一个变量的类,然后你可以从那个类中访问静态变量。
    • 没错!这就是为什么我尝试跟踪 (Type.getClass(myCar).noOfWheels);
    • 但更深层次的问题似乎没有得到解答:为什么在 Java 中不能允许 instance.staticVar 作为 TheClass.staticVar 的访问器?它的含义似乎很明确,但是我在这里忽略了什么? (我注意到在 TheClass 的方法中,我可以提及裸成员名称,它们可以解析为实例或类,不管)
    猜你喜欢
    • 2019-12-26
    • 2015-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-29
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多