Zig не має інтерфейсів на рівні мови, динамічна диспетчеризація виконується вручну. Зазвичай створюючи структуру Vtable.
pub const VTable = struct {
move: *const fn (reader: *Reader, advance: usize, len: usize) MoveError!void,
checkEncoding: *const fn (reader: *Reader, encoding: []const u8) bool,
};
Оскільки це просто набір вказівників на функції, можна підмінити потрібні функції без додаткових огорток.
fn foo() !void {
const sr = &streaming.interface;
const myVtable = &xml.Reader.VTable{
.move = sr.vtable.move,
.checkEncoding = &checkEncodingAlwaysTrue,
};
sr.vtable = myVtable;
}
fn checkEncodingAlwaysTrue(reader: *xml.Reader, encoding: []const u8) bool {
_ = reader;
_ = encoding;
return true;
}