这样的语法在C#中意味着什么?

时间:2010-04-15 04:02:56

标签: c# syntax

这样的语法在C#中是什么意思?

public abstract class HostFactory<TApp> : ServiceHostFactory
        where TApp : IFoo

4 个答案:

答案 0 :(得分:17)

HostFactory是一个公共泛型类(派生自ServiceHostFactory),带有一个名为TApp的泛型类型参数,其中任何提供的TApp必须实现IFoo接口(警告:IWhatever模式只是一种约定; IFoo 可能是一个类,我想)。类型HostFactory<TApp>不是具体类型;它必须进一步被子类化以实例化 - 大概是通过下面的东西(尽管通用子类也足够了):

public class BarHostFactory : HostFactory<Bar> {}
public class Bar : IFoo {...}

答案 1 :(得分:3)

这是一个抽象的泛型类,它继承自 ServiceHostFactory ,并对泛型类型有约束。

Constraints on Type Parameters (C# Programming Guide)

Inheritance (C# Programming Guide)

Generic Classes (C# Programming Guide)

答案 2 :(得分:2)

它说HostFactory有一个通用类型TApp,它继承自ServiceHostFactorywhere关键字信号,TApp是一个空格。

在C#2.0中,您使用where reserved关键字来定义约束。在泛型类型参数上使用where关键字,后跟派生冒号,以向编译器指示泛型类型参数实现特定接口。

http://msdn.microsoft.com/en-us/library/ms379564(VS.80).aspx

答案 3 :(得分:2)

很多人在这里,我想知道这是否是因为“IFoo”而做的功课,或者你可能做了那个替换以简化示例。

- : ServiceHostFactory,HostFactory继承自ServiceHostFactory。

- HostFactory<TApp>,HostFactory是泛型类型,因为它的类型参数为TApp。每当有人使用HostFactory类时,他们都可以为TApp指定一个类型,这将导致该类型在代码中出现TApp的任何地方使用。因此,如果该类具有函数TApp GetApp()并且为TApp指定<int>,那么GetApp实际上是int GetApp()

- where TApp : IFoo,TApp必须实现IFoo接口(这可能也是一个类,表明它必须从该类继承,而不是直接继承)。

- abstract,HostFactory是一个抽象类,意味着其他类可以从中继承,但没有代码可以实例化HostFactory本身。这就像我给你一个汽车的框架,并说,你在法律上不允许在路上驾驶它,但欢迎你自己制造一辆自己的汽车。

- public HostFactory是公共的,这意味着它对于声明它的程序集之外的代码是可见的。

编辑:有关泛型的更多信息 我将从MSDN引用一篇非常重要的引文开始:“泛型是C#2.0最强大的功能。”

当你写一些可以想象适用于许多类型的东西时,你会使用泛型。例如,在我们在2.0中使用泛型之前,我们必须先将所有内容都转换为Object,然后才能将它放入集合中,这非常危险,因为copmpiler无法验证您是否在以后获得了正确的类型集合中的一个项目。使用泛型,我们可以ArrayList<bool>创建一个bool的ArrayList,现在不需要强制转换。编译器可以验证我们是否将bool放入集合中。

例如,在上面的类中,我们可以编写与实现IFoo的东西一起工作的算法,只知道该对象能够执行IFoo接口所具有的功能。所以我可以编写一个在IFoo接口上调用方法的算法,然后我的算法将来可以被任何实现IFoo接口的人重用。