Тезисы не могут реализовать интерфейсы , потому что они являются функцией времени компиляции и не существуют во время выполнения. Это противоречит интерфейсам, они do существуют во время выполнения, и динамические проверки во время выполнения, такие как Std.is(something, IOutput)
, должны работать.
Haxe также имеет механизм, называемый структурный подтип , который можно использовать в качестве альтернативы интерфейсам. При таком подходе нет необходимости в явном объявлении implements
, достаточно, если что-то объединяет со структурой:
typedef IOutput = {
function writeInteger(aValue:Int):Void;
}
К сожалению, аннотации не совместимы со структурным подтипом из-за способа их реализации.
Рассматривали ли вы вместо этого статические расширения ? По крайней мере, для вашего простого примера это выглядит как идеальное решение для создания метода writeInteger()
, доступного для любого haxe.io.Output
:
import haxe.io.Output;
import haxe.io.BytesOutput;
using Main.OutputExtensions;
class Main {
static function main() {
var output = new BytesOutput();
output.writeInteger(0);
}
}
class OutputExtensions {
public static function writeInteger(output:Output, value:Int):Void {
output.writeInt32(value);
}
}
Вы можете даже объединить это со структурным подтипом, так что writeInteger()
станет доступным для всего, что имеет метод writeInt32()
( try.haxe link ):
typedef Int32Writable = {
function writeInt32(value:Int):Void;
}