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 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";
}
}
当我使用一些 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 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";
}
}