我试图以这样的方式编写类定义:当在函数或 var 声明(例如 function instantiateMain(mainCls:Class<MyAbstractClass>)
)中使用时,它应该强制子类具有所需的方法规范。例如,init()
方法。
所以...
是否有一种方法以抽象方式编写类,以便在编译时检查其子类(调用 ... extends MyAbstractClass
的子类)以声明特定方法,并且能够扩展另一个现有类(例如: AbstractSprite extends Sprite
或 AbstractMC extends MovieClip
)?
或者,Class<...> 可以列出多个约束类型(类和接口(interface))吗?
例如,Class<Sprite, MyInterface>
- 不过已经尝试过了,也许我的语法不正确。
编辑:
为了向问题添加更多上下文,这是我尝试运行的代码:
package;
import flash.display.DisplayObject;
import flash.display.MovieClip;
import flash.display.Sprite;
import flash.display.Stage;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.Lib;
class MyInitializer {
public static var INSTANCE:MyInitializer;
public static var STAGE:Stage;
public static function init(clazz:Class<DisplayObject, InterfaceMain>) {
if (INSTANCE != null) return INSTANCE;
//Create a new instance of this global class:
INSTANCE = new MyInitializer();
//Add the 'Main' class to the stage:
STAGE.addChild( Type.createInstance( clazz, [] ) );
return INSTANCE;
}
}
class SpriteMain extends Sprite implements InterfaceMain {
}
class MovieClipMain extends MovieClip implements InterfaceMain {
}
interface InterfaceMain {
function init():Void;
}
最佳答案
您可以将类型定义为 multiple constraints :
typedef Measurable = {
public var length(default, null):Int;
}
class Constraints {
static public function main() {
trace(test([]));
trace(test(["bar", "foo"]));
// String should be Iterable<String>
//test("foo");
}
static function
test<T:(Iterable<String>, Measurable)>(a:T) {
if (a.length == 0) return "empty";
return a.iterator().next();
}
}
关于interface - 在 Haxe 中,当子类中未在 "abstract"父类(super class)中定义方法时,如何强制执行子类中的方法声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27348210/