代码之家  ›  专栏  ›  技术社区  ›  void.pointer

如何从泛型参数继承?

c#
  •  16
  • void.pointer  · 技术社区  · 14 年前

    class UILockable<T> : T
        where T : UIWidget
    {
    }
    

    但是,这不起作用。我见过有人建议你这样做:

    class UILockable<T>
        where T : UIWidget
    {
        private T _base;
    }
    

    4 回复  |  直到 14 年前
        1
  •  24
  •   Mehrdad Afshari    14 年前

    不能从泛型类型参数继承。C语言的泛型与C++模板有很大的不同。从类型参数继承要求类具有基于类型参数的完全不同的表示形式,这与.NET泛型不同。它们在IL和本机级别上是相同的(对于所有引用类型参数)。

        2
  •  3
  •   Rodrick Chapman    14 年前

    当类型 B ,你宣布 B 类似的 A (其中相似性意味着您可以使用 B 任何你想用的地方 A ). 因为这种相似性不是对称的,所以你有 类似于 A A 不类似于 B . 此外, B C 两者都可以类似于 (即它们都是从 A )没有相似之处。

    所以您要声明的是Unlockable与UIWidget相似,但这是不可能的,因为类型相似性是不可传递的(即如果 B A 类似于 你不能说 类似于 C ).

        3
  •  3
  •   Tim Cooper    13 年前

    UILockable<T> 继承自 UIWidget 把所有的电话转到你的电脑上 T :

    class UILockable<T> : UIWidget
        where T : UIWidget
    {
        private readonly T t;
    
        public void SomeMethod()
        {
            this.t.SomeMethod();
        }
    }
    

    你根本不在乎 UIWidget工具 -只是它 实现 UIWidget工具

        4
  •  0
  •   jrista    14 年前

    不能从泛型类型参数继承。C#是严格类型语言。编译时必须知道所有类型和继承层次结构。NET泛型与C++模板不同。

    当您确定类型参数T将是UIWidget类型时,为什么不从UIWidget本身继承呢。如果允许[假设,只是假设,我知道这永远不可能]通过从已经是UIWidget类型的T继承类,您将实现什么。在设计时,您只需要针对UIWidget编写代码,所以为什么不直接从UIWidget继承呢。