sách gpt4 ai đã đi

Sự trừu tượng hóa thực hiện một giao diện như thế nào?

In lại 作者:行者123 更新时间:2023-12-04 14:49:32 26 4
mua khóa gpt4 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)。

1 Câu trả lời

bản tóm tắt can't implement interfaces因为它们是编译时特性,在运行时不存在。这与接口(interface)冲突,它们Thực ra存在于运行时并且像 Std.is(something, IOutput) 这样的动态运行时检查必须起作用。

Haxe 还有一种称为 structural subtyping 的机制。可以用作接口(interface)的替代品。使用这种方法,不需要显式的 thực hiện 声明,如果有 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/

26 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com