用逆变参数覆盖父方法

Ste*_*hey 5 haxe

基本上,我想用不同的参数覆盖父类。例如:

class Hold<T> {
    public var value:T;
    public function new(value:T) {
        set(value);
    }
    public function set(value:T) {
        this.value = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后覆盖该类,例如:

class HoldMore extends Hold<T> {
    public var value2:T;
    public function new(value:T, value2:T) {
        super(value);
        set(value, value2);
    }
    override public function set(value:T, value2:T) {
        this.value = value;
        this.value2 = value2;
    }
}
Run Code Online (Sandbox Code Playgroud)

显然这会返回一个错误,Field set overloads parent class with different or incomplete type. 有没有解决的办法?我尝试使用 a public dynamic function,然后setnew()函数中进行设置,但这给出了一个非常相似的错误。有什么想法吗?

dag*_*ies 4

这只是对 @stroncium 答案的补充,这是完全正确的。

这是一个示例

class Hold<T> {
    public var value:T;
    public function new(value:T) {
        set(value);
    }
    public function set(value:T) {
        this.value = value;
    }
}

class HoldMore<T> extends Hold<T> {
    public var value2:T;
    public function new(value:T, value2:T) {
        super(value);
        setBoth(value, value2);
    }
    // you cannot override "set" with a different signature
    public function setBoth(value:T, value2:T) {
        this.value = value;
        this.value2 = value2;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用数组作为参数或保存多个值的动态对象,以便使用相同的方法“设置”它们,但会丢失一些编译器的类型检查。