2014-06-17 65 views
4

基本上,我想覆蓋具有不同參數的父類。例如:用反變參數覆蓋父方法

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,然後在new()函數中設置set,但這給出了非常類似的錯誤。有什麼想法嗎?

回答

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

替代地,可以使用數組作爲參數或動態對象,以便保持多個值,以「固定」它們使用相同的方法,但是你放棄了一些編譯器的類型檢查。

0

不幸的是,語言不允許。

0

如果你寫了基類,你可以給它添加一個可選的參數,但這將是一個解決方法,但不是直接做你想做的。

1

在目前的狀態下,它完全無法工作。這裏不僅是1層的問題,但很少:

  1. T型是在這個新類的情況下毫無意義的,你應該可以選用一些具體類型或超過T.模板該類
  2. 你不能改變覆蓋它時函數的參數個數。但是,您可以添加另一個函數(使用不同的名稱)來接受2個參數並執行您想要的操作(順便說一句,您將在多數語言中使用這種方式)。
  3. 我真的不明白你在那裏看到一個逆變問題。實際的問題是haxe不支持函數超載。 (實際上,函數簽名是名稱+完整類型,但這不是你想寫或支持的內容,並且主要用於js/java extern。)