代码之家  ›  专栏  ›  技术社区  ›  Tamas Czinege

C语言中非泛型接口泛型成员实现的类型约束#

  •  8
  • Tamas Czinege  · 技术社区  · 14 年前

    假设我有这样一个界面:

    interface IAwesome
    {
        T DoSomething<T>();
    }
    

    有没有办法用类型约束实现DoSomething方法?显然,这是行不通的:

    class IncrediblyAwesome<T> : IAwesome where T : PonyFactoryFactoryFacade
    {
        public T DoSomething()
        {
            throw new NotImplementedException();
        }
    }
    

    编辑 :正在讨论的接口是 System.Linq.IQueryProvider 所以我不能修改接口本身。

    3 回复  |  直到 14 年前
        1
  •  7
  •   Lucero    14 年前

    不,这不是故意的,因为这意味着 IAwesome 不会(完全)满意。

    IncrediblyAwesome<T> 工具 壮丽 ,可以这样做:

    IAwesome x = new IncrediblyAwesome<Something>()
    

    显然,由于您的附加约束,这无法工作,因为 壮丽 不知道对它的限制。

    在您的情况下,我能想到的唯一解决方案是(执行运行时检查):

    interface IAwesome { // assuming the same interface as in your sample
        T DoSomething<T>();
    }
    
    class IncrediblyAwesome<TPony> : IAwesome where TPony : PonyFactoryFactoryFacade {
        IAwesome.DoSomething<TAnything>() {
            return (TAnything)((object)DoSomething()); // or another conversion, maybe using the Convert class
        }
    
        public TPony DoSomething() {
            throw new NotImplementedException();
        }
    }
    
        2
  •  2
  •   Yvo    14 年前

    像这样的事情不会起作用吗?

    interface IAwesome<U>
    {
        T DoSomething<T>() where T : U
    }
    
    class IncrediblyAwesome<T> : IAwesome<PonyFactoryFactoryFacade>
    {
        public T DoSomething()
        {
            throw new NotImplementedException();
        }
    }
    

        3
  •  1
  •   MartinStettner    14 年前

    此外,您的示例在另一方面违反了合同:一个 IncrediblyAwesome PonyFactoryFactoryFacade (顺便说一句,我会 真正地 对本课程的目的感兴趣:-))。因此,具体实施 DoSomething 是接口中指定的泛型方法,但始终返回一个单一类型。你不能写:

    IAwesome a = new IncrediblyAwesome<SomePonyFacadeFactory1>();
    SomePonyFacadeFactory2 facade2 = a.DoSomething<SomePonyFacadeFactory2>();
    

    即使两个门面工厂都从 PonyFactoryFacade ...

    另一个评论:我会远离黑魔法铸造,因为这些问题是你的设计固有的,而不仅仅是C#的缺点。。。