gpt4 book ai didi

interface - 抽象如何实现接口(interface)?

转载 作者:行者123 更新时间:2023-12-04 14:49:32 25 4
gpt4 key购买 nike

我有一个通用接口(interface)来描述对输出流的访问,如下所示:

interface IOutput {
function writeInteger(aValue:Int):Void;
}

我有一个基于标准 haxe.io.BytesOutput 类的这个接口(interface)的抽象实现:

abstract COutput(BytesOutput) from BytesOutput {
public inline function new(aData:BytesOutput) {
this = aData;
}
public inline function writeInteger(aValue:Int):Void {
this.writeInt32(aValue);
}
}

虽然这个抽象真正实现了上述接口(interface),但没有直接引用接口(interface),当我尝试像这样使用它时:

class Main {
public static function out(aOutput:IOutput) {
aOutput.writeInteger(0);
}
public static function main() {
var output:COutput = new BytesOutput();
out(output); // type error
}
}

编译器抛出错误:COutput 应该是 IOutput。我只能通过使用包装BytesOutput并实现IOutput的通用类来解决这个问题。

我的问题是如何向 Haxe 编译器显示抽象实现了接口(interface)。

最佳答案

摘要 can't implement interfaces因为它们是编译时特性,在运行时不存在。这与接口(interface)冲突,它们确实存在于运行时并且像 Std.is(something, IOutput) 这样的动态运行时检查必须起作用。

Haxe 还有一种称为 structural subtyping 的机制。可以用作接口(interface)的替代品。使用这种方法,不需要显式的 implements 声明,如果有 unifies 就足够了有一个结构:

typedef IOutput = {
function writeInteger(aValue:Int):Void;
}

很遗憾,摘要 aren't compatible with structural subtyping要么是因为它们的实现方式。


您是否考虑过使用 static extensions反而?至少对于您的简单示例,这似乎是使 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;
}

关于interface - 抽象如何实现接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54135716/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com