Haxe:本机接口属性可实现吗?

Haxe: Native Interface properties implementable?

当我使用一些 class 实现一个接口时,我遇到了这个编译时错误,该接口具有在某些本机子 class 中定义的属性,例如 openfl.display.Sprite。它发生在我针对 flash 而不是 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))

相比之下,'native' 方法或 'non-native' 属性的接口定义没有问题。这些工作。

我是否必须避免(不是很典型)使用 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 ):
}

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

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

希望对您有所帮助。

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";

    }

}