C#类设计时,何时用类继承(Base Class)何时用接口(Interface)

简介:
Base class 和 Interface的使用,有时很容易判断,有时又很难区分。
1)二者的主要区别:Base class 体现了“IS A”的关系,而Interface体现的是“CAN DO”的关系。因为C#不允许多重继承(Multi-inherit),所以,如果派生的类不能正确的反映IS-A的关系,就不要使用基类;而如果不同的类或对象(Type)包含了同样的CAN-DO的功能,那么就用接口。另外,值类型(Value type)只能使用接口,不能使用Base Class;
2)相比Interface,使用Base Class的有点:
  i)使用方便(Easy of use):基类提供了大量现成的方法、功能,子类可以直接使用;而使用接口时,必须定义接口规定的所以的成员;
  ii)执行稳定(consistent implementation): 不管关于接口的文档的描述有多么完善,其他人(第三方)在根据接口完善类时,也都会遇到很多问题,不可能做到100%的准确,这样就导致了bug的产生,而使用基类方式,定义一个可以正确执行的基类,而在派生类中适当的修改已达到最终需求,无疑会使程序更加稳定,出问题的几率更小;
  iii)扩展(Versioning):如果给基类增加新的方法(method),那么,继承的子类可能无需编译即可使用基类中新增加这些方法;而使用接口的话,就不这么容易了,接口中增加新的声明后,必须在子类中去实现(implement)这些新增的方法。
3)使用interface的一些情况:对于那些提供的相对稳定(consistent)的操作的类,最好给它们定义一个统一的interface。 如,你的类中都有聚合对象(列表),都能够增加、插入、删除某一列表中的项目,那么,我们就可以让他们都继承与IList<T>接口,此时,你就可以对你的那些类进行增加、插入、删除等操作,而无需知道他们的具体类,因为你知道他们都实现了IList<T>接口的方法。

4)当然,有时定义接口和使用类继承效果没什么区别,如实现Compare功能,FLC提供了ICompareer<T>和Comparer<T>的抽象类供继承。看你的习惯了:)



本文转自Jack Niu博客园博客,原文链接:http://www.cnblogs.com/skywind/archive/2007/05/11/743002.html,如需转载请自行联系原作者

相关文章
|
2月前
|
开发框架 .NET C#
C#|.net core 基础 - 删除字符串最后一个字符的七大类N种实现方式
【10月更文挑战第9天】在 C#/.NET Core 中,有多种方法可以删除字符串的最后一个字符,包括使用 `Substring` 方法、`Remove` 方法、`ToCharArray` 与 `Array.Copy`、`StringBuilder`、正则表达式、循环遍历字符数组以及使用 LINQ 的 `SkipLast` 方法。
|
3月前
|
存储 C# 索引
C# 一分钟浅谈:数组与集合类的基本操作
【9月更文挑战第1天】本文详细介绍了C#中数组和集合类的基本操作,包括创建、访问、遍历及常见问题的解决方法。数组适用于固定长度的数据存储,而集合类如`List<T>`则提供了动态扩展的能力。文章通过示例代码展示了如何处理索引越界、数组长度不可变及集合容量不足等问题,并提供了解决方案。掌握这些基础知识可使程序更加高效和清晰。
85 2
|
2月前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
119 65
|
2月前
|
C#
C# 接口(Interface)
接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分。 接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。 接口使得实现接口的类或结构在形式上保持一致。 抽象类在某种程度上与接口类似,但是,它们大多只是用在当只有少数方法由基类声明由派生类实现时。 接口本身并不实现任何功能,它只是和声明实现该接口的对象订立一个必须实现哪些行为的契约。 抽象类不能直接实例化,但允许派生出具体的,具有实际功能的类。
49 9
|
3月前
|
安全 C#
C# 面向对象编程的三大支柱:封装、继承与多态
【9月更文挑战第17天】在C#中,面向对象编程的三大支柱——封装、继承与多态,对于编写安全、可维护、可复用的代码至关重要。封装通过访问修饰符和属性保护数据;继承允许子类继承父类的属性和方法,实现代码复用和多态;多态则提高了代码的灵活性和通用性。掌握这三大概念能显著提升C#编程能力,优化开发效率和代码质量。
|
2月前
|
Java 程序员 C#
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
【类的应用】C#应用之派生类构造方法给基类构造方法传参赋值
13 0
|
3月前
|
C# 索引
C# 一分钟浅谈:接口与抽象类的区别及使用
【9月更文挑战第2天】本文详细对比了面向对象编程中接口与抽象类的概念及区别。接口定义了行为规范,强制实现类提供具体实现;抽象类则既能定义抽象方法也能提供具体实现。文章通过具体示例介绍了如何使用接口和抽象类,并探讨了其实现方式、继承限制及实例化差异。最后总结了选择接口或抽象类应基于具体设计需求。掌握这两者有助于编写高质量的面向对象程序。
125 5
|
3月前
|
存储 C#
C# 一分钟浅谈:继承与多态性的实践
【9月更文挑战第2天】本文从基础入手,详细介绍了面向对象编程中继承与多态性的核心概念。通过 `Animal`、`Dog` 和 `Cat` 类的示例代码,展示了如何利用继承重用代码及多态性实现不同对象对同一方法的多样化响应,帮助读者更好地理解和应用这两个重要概念,提升面向对象编程能力。
45 3
|
3月前
|
C# 数据安全/隐私保护
C# 一分钟浅谈:类与对象的概念理解
【9月更文挑战第2天】本文从零开始详细介绍了C#中的类与对象概念。类作为一种自定义数据类型,定义了对象的属性和方法;对象则是类的实例,拥有独立的状态。通过具体代码示例,如定义 `Person` 类及其实例化过程,帮助读者更好地理解和应用这两个核心概念。此外,还总结了常见的问题及解决方法,为编写高质量的面向对象程序奠定基础。
27 2
|
4月前
|
C#
C# 面向对象编程(三)——接口/枚举类型/泛型
C# 面向对象编程(三)——接口/枚举类型/泛型
36 0