从仅在方法中设置类型的接口获取具有泛型类型的对象

时间:2012-10-04 20:26:28

标签: c# inheritance

这不起作用:

public interface IServerFuncs
{
    Table<T> getTable<T>() where T : MasterClass;
    //*cut* other stuff here
}

public class DefaultFuncs<T> : IServerFuncs where T : MasterClass
{
    Table<T> table;

    public DefaultFuncs(Table<T> table)
    {
        this.table = table;
    }

    public Table<T> getTable()
    {
        return table;
    }
}

它是DefaultFuncs<T>' does not implement interface member 'IServerFuncs.getTable<T>()'

但我也不能这样做:

public Table<T> getTable<T>() where T:MasterClass
{
    return table;
}

它是Error: Cannot implicitly convert type 'MySQLCache.Table<T>。我猜方法中的T与DefaultFuncs<T>冲突,所以我尝试了:

public Table<T2> getTable<T2>() where T2:MasterClass
{
    return table;
}

但它又出现了另一个错误:Error Cannot implicitly convert type 'Table<T>' to 'Table<T2>'

我需要在不向IServerFuncsIServerFuncs<T>)添加通用类型的情况下实现此功能..任何想法?

2 个答案:

答案 0 :(得分:1)

如果不在界面中添加模板修改器,我认为你不能这样做,否则你可以这样做:

public class MC1 : MasterClass
{
}

public class MC2 : MasterClass
{
}

IServerFuncs df = new DefaultFuncs<MC1>(new Table<MC1>());
Table<MC2> table = df.getTable<MC2>();   // obviously not correct.

基本上,为了保证接口和实现使用相同的类型,您需要将限定符添加到接口定义中:

public interface IServerFuncs<T> where T : MasterClass
{
    Table<T> getTable();
    //*cut* other stuff here
}

public class DefaultFuncs<T> : IServerFuncs<T> where T : MasterClass
{
    Table<T> table;

    public DefaultFuncs(Table<T> table)
    {
        this.table = table;
    }

    public Table<T> getTable()
    {
        return table;
    }
}

答案 1 :(得分:1)

你可以做到

public Table<T2> getTable<T2>() where T2:MasterClass
{
    return (Table<T2>)(object)table;
}

如果您知道T和T2将始终是相同的类型。如果不是,您将获得运行时异常。