使用带有索引器的类,在重写的成员数组的访问器中

时间:2014-02-26 19:36:52

标签: c# inheritance override accessor indexer

我有一个带有索引器的类:

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{}访问者使用我的索引类获取/设置值的想法?

更多学术上,WHY不是索引器,返回/接受X类型的变量,IMPLY转换为X类型的数组?可以以某种方式明确定义这样的转换吗?

约束:我无法对BaseClass进行更改。

2 个答案:

答案 0 :(得分: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类型的变量,   IMPLY转换为X类型的数组?

Indexer只是这两种方法的语法糖:

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

我无法想象,如何将其转换为数组。

答案 1 :(得分:0)

  

为什么没有索引器,返回/接受类型X的变量,IMPLY转换为类型X的数组

因为除了使用索引器之外,数组还可以执行某些操作。例如,您可以询问一个长度。具有索引器的类也可以具有数组不具有的功能,因此您不能使用索引器将任何类隐式转换为数组。

看起来你想要做的是能够添加给定泛型参数具有索引器的泛型约束。 你不能那样做。它不是语言的一个特征,与you can't add a generic constraint that a class overloads any other operator的方式大致相同。

如果您个人知道如何将T类型的数组转换为类型SpecialArray的{​​{1}},那么您可以在SomeDerivedClass的get / set方法中自行提供转换。索引器(或调用其他地方的实现)。根据您对如何将一种类型转换为另一种类型的个人知识,这需要完全明确。它不可能是隐含的。