Haxe:Native Interface属性是否可实现?

时间:2017-11-16 14:31:24

标签: haxe

当我让一些类实现一个接口,其属性已经在某些本地子类中被定义为openfl.display.Sprite时,我遇到了这个编译时错误。它发生在我定位闪存时,而不是js。

Field get_someValue needed by SomeInterface is missing
Field set_someValue needed by SomeInterface is missing
Field someValue has different property access than in SomeInterface (var should be (get,set))

相比之下,“原生”方法或“非原生”属性的界面定义没有问题。那些工作。

我是否必须避免使用haxe的接口(不是那么典型)并重写我的代码?或者有什么方法可以绕过这个问题吗?

提前致谢。

示例:

class NativePropertyInterfaceImplTest 
{
    public function new() 
    {
        var spr:FooSprite = new FooSprite();
        spr.visible = !spr.visible;
    }
}

class FooSprite extends Sprite implements IFoo
{
    public function new()
    {
        super();
    }
}

interface IFoo 
{
    public var visible (get, set):Bool; // Cannot use this ):
}

2 个答案:

答案 0 :(得分:2)

TL; DR

您需要在Flash目标上使用稍微不同的签名:

interface IFoo 
{
    #if flash
    public var visible:Bool;
    #else
    public var visible (get, set):Bool;
    #end
}

其他信息

Haxe getset暗示get_property():Tset_property(value:T):T都存在。 OpenFL将此语法用于许多属性,包括displayObject.visible

核心ActionScript VM类(例如Sprite)不使用Haxe get / set,而是本机属性。这就是他们看起来不同的原因。

覆盖核心属性

如果您需要覆盖这样的核心属性,下面是一个示例,说明如何对Flash和OpenFL上的其他目标执行此操作:

class CustomSprite extends Sprite {

    private var _visible:Bool = true;

    public function new () {

        super ();

    }

    #if flash

    @:getter(visible) private function get_visible ():Bool { return _visible; }
    @:setter(visible) private function set_visible (value:Bool):Void { _visible = value; }

    #else

    private override function get_visible ():Bool { return _visible; }
    private override function set_visible (value:Bool):Bool { return _visible = value; }

    #end

}

覆盖自定义属性

自定义属性不需要这样,在所有平台上都是相同的:

class BaseClass {

    public var name (default, set):String;

    public function new () {

    }

    private function set_name (value:String) {

        return this.name = value;

    }

}

class SuperClass {

    public function new () {

        super ();

    }

    private override function set_name (value:String):String {

        return this.name = value + " Q. Public";

    }

}

答案 1 :(得分:0)

需要在接口中提供方法签名。目前它只是一个财产声明。

错误消息说明了一切。 Field get_someValue needed by SomeInterface is missing Field set_someValue needed by SomeInterface is missing

希望这有帮助。