我正在使用C#学习泛型类型,我发现了这篇关于泛型类的MSDN文章http://msdn.microsoft.com/en-us/library/sz6zd40f.aspx。几乎一切都很好,但我对封闭构造类型概念表示怀疑。
所以,我决定编写一些测试代码来探索这个概念:
using System;
using System.Collections;
namespace Articulos.Cap03
{
internal class ClaseBase <T> { }
internal class SubclaseGenerica<T> : ClaseBase <long> { }
internal class HerenciaCerrada
{
public static void Main()
{
SubclaseGenerica<decimal> sg1 = new SubclaseGenerica<decimal>();
SubclaseGenerica<Object> sg2 = new SubclaseGenerica<Object>();
SubclaseGenerica<ArrayList> sg3 = new SubclaseGenerica<ArrayList>();
}
}
}
它可以正确编译和执行。
什么是porpuse:
internal class SubclaseGenerica<T> : ClaseBase <long> { }
[注意:我认为它将SubclaseGenerica的参数类型限制为long
基元类型。]
答案 0 :(得分:2)
当你给课程一些内容时,更容易理解它:
internal class ClaseBase<T>
{
public T BaseValue { get; set; }
}
internal class SubclaseGenerica<T> : ClaseBase<long>
{
public T DerivedValue { get; set; }
}
现在看看SubclaseGenerica<decimal> sg1 = new SubclaseGenerica<decimal>();
BaseValue
的类型为long
,DerivedValue
的类型为Decimal
。
您已将基类定义中使用的泛型类型修复为long
。然后,您创建了一个完全不同的泛型参数,用于在派生类型中执行完全不同的事物。
虽然您拥有的代码不一定错误,但它肯定是可疑的。通常,当看一个封闭的构造类型时,人们会期望看到类似的东西:
internal class SubclaseGenerica : ClaseBase<long>
{
public long DerivedValue { get; set; }
}
派生类型本身不是通用的,并且正在修复基类的泛型类型。
答案 1 :(得分:1)
嗯,这肯定是奇数声明:
internal class SubclaseGenerica<T> : ClaseBase <long> { }
在这种情况下,它是一种通用类型 - 因此它声明了 new 类型参数T
。但是,它为long
提供了ClaseBase
的类型参数。所以你可以写:
ClaseBase<long> foo = new SubclaseGenerica<string>();
那没关系。 ClaseBase
中的任何代码都会(在执行时)看到T
为long
,SubclaseGenerica
中的任何代码都会(在执行时)看到T
是string
,因为它们是两种不同的类型参数。