2014-02-26 24 views
-1

裏面我有一個索引類:使用一類具有一個索引,一個重寫的成員陣列的訪問

public class SpecialArray<T> 
{ 
    public T this[long index] 
    { 
     get { return SpecialGetFunction(index) } 
     set { SpecialSetFunction(index, value); } 
    } 

    private void SpecialSetFunction(long index, T value) { ...blah blah... } 
    private T SpecialGetFunction(long index) { ...blah blah... } 
} 

我有一個目前在一個數組另一個類:

public class BaseClass<T> 
{ 
    private T[] _actual_nodes; 

    public virtual T[] Nodes 
    { 
     get { return _actual_nodes; } 
     set { _actual_nodes = value; } 
    } 
} 

現在我想覆蓋BaseClass<T>,所以它將使用我的索引類,而不是_actual_nodes陣列。

public class SomeDerivedClass<T> : BaseClass<T> 
{ 
    private SpecialArray<T> _new_nodes_array; 

    public override T[] Nodes 
    { 
     get { return _new_nodes_array; } 
     set { _new_nodes_array = value; } 
    } 
} 

不幸的是,這最後一堂課生成編譯器錯誤,指出它不能隱式地從SpecialArray<T>類型轉換爲T[](反之亦然)

所以我只是不知道如何做了get/set語句使用我的索引類,而不是數組。起初,我想知道是否有引用傳遞給get/set的「節點」的索引?但是,即使有,使用它仍然只允許我設置/設置一個T元素,而不是一個T[]的數組。

問題
人對如何我可以使覆蓋T[] Nodes{}訪問使用我的索引類的get/set值的想法?

更多學術上,爲什麼不是一個索引器,返回/接受一個X類型的變量,IMPLY轉換爲一個X類型的數組?可以以某種方式明確定義這種轉換嗎?

約束:我無法對BaseClass進行更改。

回答

1

如果可以轉換到/從T[],然後使用轉換運算符:

public class SpecialArray<T> 
{ 
    public static explicit operator SpecialArray<T>(T[] array) { /* conversion logic here */ } 
    public static explicit operator T[](SpecialArray<T> array) { /* conversion logic here */ } 

    // the rest of class here 
} 

public class SomeDerivedClass<T> : BaseClass<T> 
{ 
    private SpecialArray<T> _new_nodes_array; 
    public override T[] Nodes 
    { 
     get{ return (T[])_new_nodes_array; } 
     set{ _new_nodes_array= (SpecialArray<T>)value; } 
    } 
} 

爲什麼沒有一個索引,返回/接受X類型的變量, 意味着轉換到陣列X型?

索引僅僅是這對夫妻的方法語法糖:

T get_Item(long index); 
void set_Item(T value, long index); 

我無法想象,這可怎麼轉換成數組。

0

爲什麼沒有一個索引,返回/接受X類型的變量,意味着轉化爲式X

的陣列因爲數組可以做的事情只是除了使用一個索引。例如,你可以問一個長度。具有索引器的類也可以具有數組不具有的功能,因此您不能使用索引器將任何類隱式轉換爲數組。

它看起來像你想要做的就是能夠添加給定泛型參數具有索引器的通用約束。 你不能那樣做。這根本不是該語言的一個特徵,與you can't add a generic constraint that a class overloads any other operator幾乎一樣。

如果你個人來說,知道如何打開T類型的數組TSpecialArray那麼你可以提供SomeDerivedClass的索引的get/set方法是轉換自己(或其他地方調出的實現)。根據您對如何將一種類型轉換爲另一種類型的個人知識,這需要完全明確。它不可能是隱含的。

+0

「因爲數組除了使用索引器之外還可以做其他事情,例如,你可以問一個它的長度。」有趣;那麼,我是否可以從IDontKnowWhatClass派生類ArrayArray ,以實現在各方面都像數組一樣實現此功能所需的功能? – Glurth

+0

@Glurth不,你不能。即使你提供了所有必要的組件(爲了記錄,你實際上不能這樣做),也就是說,你不能像數組那樣實現協變性),編譯器不會有任何方法來驗證你已經實現了所有必要的組件。就像你創建兩個具有相同字段的類一樣,你仍然不能隱式地將一個轉換爲另一個,你需要明確地定義如何將一個轉換爲另一個。 – Servy

+0

Darn,我想把它標記爲答案,它確實提高了Dennis提供的技術性答案,對不起。 – Glurth

相關問題