.NET 指南:类与接口之间的选择
2007-01-28 20:46
363 查看
接口对必须由实现者所提供的成员集合的签名进行定义。接口不能够为成员提供实现的细节。例如,ICollection 接口定义了与集合操作相关的成员。实现了接口的每一个类都必须为这些成员提供实现细节。并且一个类能够实现多个接口。
类既定义了成员签名也为每个成员定义了实现细节。抽象(在 Visual Basic 中是 MustInherit)类能够拥有与定义成员的接口或常规类一样的行为,虽然它们仍然能够提供具体的实现细节,但是这不是必需的,而继承自抽象类的具体类则不需要提供必需的实现。
抽象类和接口分别从实现中支持不同的约定,接口不能够在后续版本中指定新的成员,而抽象类则能够按照需要随意地添加成员来支持附加的功能。
赞成在接口之上定义类进。在类的后续版本中,你可以安全地把新的成员添加到类中;但是你无法在不破坏现有代码的情况之下把成员添加到接口中。
使用抽象(在 Visual Basic 中是 MustInherit)类来替代接口以减少来自于实现的约定。如果你需要为值类型提供一个多态层次的时候,就需要定义一个接口。值类型必须继承自 ValueType,并且只能够继承自 ValueType,因此它们不能够通过类来对约定以及实现进行分离。在这种情况下,如果你的值类型需要多态的行为,你就必须使用一个接口。
考虑定义接口来完成一个与多重继承相类似的效果。如果一个类型必须实现多个约定,或者约定可以适用于多种类型,那么就可以使用接口。例如,IDisposable 就是通过在多个不同的情节中被使用的类型而被实现的。要求类从一个能够被处理的基类那里进行继承的做法将会导致这个类的层次过于僵硬。例如,MemoryStream 类将会对基于父类的数据流约定进行继承,但是它不能这样做并且同时也是可处理的。
类既定义了成员签名也为每个成员定义了实现细节。抽象(在 Visual Basic 中是 MustInherit)类能够拥有与定义成员的接口或常规类一样的行为,虽然它们仍然能够提供具体的实现细节,但是这不是必需的,而继承自抽象类的具体类则不需要提供必需的实现。
抽象类和接口分别从实现中支持不同的约定,接口不能够在后续版本中指定新的成员,而抽象类则能够按照需要随意地添加成员来支持附加的功能。
赞成在接口之上定义类进。在类的后续版本中,你可以安全地把新的成员添加到类中;但是你无法在不破坏现有代码的情况之下把成员添加到接口中。
使用抽象(在 Visual Basic 中是 MustInherit)类来替代接口以减少来自于实现的约定。如果你需要为值类型提供一个多态层次的时候,就需要定义一个接口。值类型必须继承自 ValueType,并且只能够继承自 ValueType,因此它们不能够通过类来对约定以及实现进行分离。在这种情况下,如果你的值类型需要多态的行为,你就必须使用一个接口。
考虑定义接口来完成一个与多重继承相类似的效果。如果一个类型必须实现多个约定,或者约定可以适用于多种类型,那么就可以使用接口。例如,IDisposable 就是通过在多个不同的情节中被使用的类型而被实现的。要求类从一个能够被处理的基类那里进行继承的做法将会导致这个类的层次过于僵硬。例如,MemoryStream 类将会对基于父类的数据流约定进行继承,但是它不能这样做并且同时也是可处理的。
相关文章推荐
- .NET 指南:属性与方法之间的选择
- .NET 指南:类与结构之间的选择
- 接口的作用,和抽象类之间的选择
- 一次AOP与面向接口之间徘徊的选择
- 在类和接口之间选择
- .NET 指南:明确地实现接口的成员
- .NET 指南:枚举与 Boolean 参数之间的选择
- Razor视图引擎布局 Razor视图引擎的基本概念与法语 SQL Server Mobile 和 .NET 数据访问接口之间的数据类型映射 binary 和 varbinary datetime 和 smalldatetime float 和 real
- SQL Server Mobile 和 .NET 数据访问接口之间的数据类型映射
- .NET 指南:类、结构,以及接口的名称
- .NET 指南:接口的设计
- 通过接口定义Fragment之间的跳转
- Fragment之间传值用接口回掉
- [翻译] 编写高性能 .NET 代码--第二章 GC -- 减少分配率, 最重要的规则,缩短对象的生命周期,减少对象层次的深度,减少对象之间的引用,避免钉住对象(Pinning)
- .Net实现微信公众平台开发接口(三) 之 “信息回复”
- .NET开发AutoCAD指南
- java 集合(6) 选择集合类标准 / Map 接口用法
- .NET、C#和ASP.NET三才之间的区别
- Dotnet中用接口描述is和as操作符之间的区别
- 极简 HTTP 接口设计状态码指南