封闭式构造的目的是什么?

时间:2014-05-22 18:42:29

标签: c# generics

我正在使用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基元类型。]

2 个答案:

答案 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的类型为longDerivedValue的类型为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中的任何代码都会(在执行时)看到TlongSubclaseGenerica中的任何代码都会(在执行时)看到Tstring,因为它们是两种不同的类型参数。