C#中泛型的子类

时间:2019-04-05 20:26:35

标签: c#

我在Unity中有一个泛型类,我希望在使用int类型时可以在其中有一个附加变量。

我的通用类Grid<int>

public class Grid<T>
{
    public T[] array;
}

我试图用名为Grid<T>的类扩展通用类Grid<int>以便能够在其中添加变量:

public class Grid<int> : Grid<T>
{
    string additionalVariable;
}

但这会引发错误

The type or namespace name 'T' could not be found (are you missing a using directive or an assembly reference?)

如何实现创建new Grid<int>类使我可以访问Grid<int>.additionalVariable,但是new Grid<float>却不能?

2 个答案:

答案 0 :(得分:1)

如果要创建一个具体的类,则应给该类一个唯一的名称,并在继承定义中定义type参数。

public class IntGrid : Grid<int>
{
     // Yourvariablehere
} 

答案 1 :(得分:1)

当开发人员“扩展”一个类时,实际上意味着他们正在创建一个 new 类来扩展现有的类。例如,要添加一个字符串变量,您可能需要这样:

public class Grid<T>
{
    public T[] array;
}

public class ExtendedGrid<T> : Grid<T>
{
    string additionalVariable;
}

var grid = new Grid<int>();
grid.additionalVariable = "Hello world"; //Error: method does not exist

var extendedGrid = new ExtendedGrid<int>();
extendedGrid.additionaVariable = "Hello world"; //Works

扩展类时,可以选择将通用类型打开(如上)或关闭(如以下示例所示)。

public class Grid<T>
{
    public T[] array;
}

public class ExtendedGrid : Grid<int>  
{
    string additionalVariable;
}

var extendedGrid = new ExtendedGrid(); //No need to specify int as the type argument

如果您不想修改原始类,但想要向其添加成员,则唯一的选择是添加扩展方法:

static public class ExtensionMethods
{
    public static string GetAdditionalVariable<T>(this Grid<T> source)
    {
        return "Hello world";
    }
}

var grid = new Grid<int>();
var s = grid.GetAdditionalVariable();

不幸的是,没有扩展字段之类的东西,所以我猜您想获得前两个示例之一。