代码之家  ›  专栏  ›  技术社区  ›  YvesScherdin

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

  •  1
  • YvesScherdin  · 技术社区  · 7 年前

    当我让一些类实现一个接口,该接口的属性是在一些本机子类(如openfl)中定义的时,会出现编译时错误。陈列(传说中的)精灵它发生在我瞄准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))
    

    相反,“本机”方法或“非本机”属性的接口定义没有问题。这些工作。

    我是否必须避免使用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 回复  |  直到 7 年前
        1
  •  2
  •   Joshua Granick    7 年前

    TL;博士

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

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

    其他信息

    哈克斯 get set 暗示 get_property():T set_property(value:T):T 两者都存在。OpenFL将此语法用于许多属性,包括 displayObject.visible .

    核心ActionScript虚拟机类(例如 Sprite )不要使用Haxe 收到 / ,但为本机属性。这就是他们看起来不同的原因。

    替代核心属性

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

    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";
    
        }
    
    }
    
        2
  •  0
  •   saumya    7 年前

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

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

    希望这能有所帮助。