Что если у меня есть классы, которые отличаются только некоторой константой, используемой в коде.Можно ли иметь одну универсальную реализацию без затрат времени выполнения?
Вот пример (это немного слишком долго ...)
@:enum abstract Param(Int) {
var foo = 0;
var bar = 1;
}
class WorkBase {
public function new() {}
private inline function work_impl(p: Param): Void {
if(p == foo) {
trace('foo');
}
else {
trace('bar');
}
}
public function work(): Void {
}
}
class WorkFoo extends WorkBase{
override public function work(): Void {
work_impl(foo);
}
}
class WorkBar extends WorkBase {
override public function work(): Void {
work_impl(bar);
}
}
class Test {
public static function main() {
var workFoo = new WorkFoo();
var workBar = new WorkBar();
workFoo.work();
workBar.work();
}
}
После компиляции с -D analyzer-optimize
мы будемобратите внимание, что функции WorkFoo.work()
и WorkBar.work()
были оптимизированы и содержат только одну ветвь кода, которая соответствует одному из значений Param
.В реальной жизни в 1010 * таких сравнений много, и все они оптимизированы.Это хорошо.
Но что, если я не хочу создавать WorkFoo
и WorkBar
вручную.Можно ли сделать что-то вроде этого:
@:generic
class WorkBase<PARAM> {
private inline function work_impl(p: Param): Void {
...
}
public function work(): Void {
work_impl(PARAM);
}
}
Самая близкая вещь, которую я знаю, это const-type-параметр .Но я не считаю, что универсальная сборка - это хороший выбор.