当我让一些类实现一个接口,其属性已经在某些本地子类中被定义为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 ):
}
答案 0 :(得分:2)
您需要在Flash目标上使用稍微不同的签名:
interface IFoo
{
#if flash
public var visible:Bool;
#else
public var visible (get, set):Bool;
#end
}
Haxe get
和set
暗示get_property():T
和set_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
希望这有帮助。