使用逆变参数覆盖父方法

时间:2014-06-17 21:50:16

标签: haxe

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

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

然后覆盖该类,例如:

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;
    }
}

显然这会返回错误Field set overloads parent class with different or incomplete type。有没有解决的办法?我尝试使用public dynamic function,然后在set函数中设置new(),但这会产生非常类似的错误。有什么想法吗?

4 个答案:

答案 0 :(得分:3)

这只是@ 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;
    }
}

或者,你可以使用一个数组作为参数或一个包含多个值的动态对象,以便设置&#34;它们使用相同的方法,但是你放弃了一些编译器的类型检查。

答案 1 :(得分:1)

如果你编写了基类,你可以为它添加一个可选参数,但这可能是一种解决方法,而不是你想要做的。

答案 2 :(得分:1)

在目前的状态下,它完全不起作用。不仅有一个问题,而且很少有问题:

  1. 在这个新类的上下文中,类型T是没有意义的,你应该使用一些具体的类型或模板这个类而不是T。
  2. 覆盖时,无法更改函数的参数个数。但是,您可以添加另一个函数(使用不同的名称)来接受2个参数并执行您想要的操作(顺便说一句,这是您在大多数语言中使用的方式)。
  3. 我真的不明白你是怎么看待那里的逆变问题的。实际问题是haxe不支持函数重载。 (实际上,函数签名是name + full类型,但这不是你想写的也不支持的,主要用于js / java externs。)

答案 3 :(得分:0)

不幸的是,语言不允许这样做。