加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

[你必须知道的.NET] 第二回:对抽象编程:接口和抽象类

发布时间:2020-12-15 21:11:59 所属栏目:asp.Net 来源:网络整理
导读:div style="FONT-SIZE: 10pt" 什么是接口? 什么是抽象类? ///?定义抽象类///? abstract?public?class?Animal{????//定义静态字段????static?protected?int?_id;?????//定义属性????public?abstract?static?int?Id????{????????get;????????set;????}?????/

<div style="FONT-SIZE: 10pt">

  • 什么是接口?

????public?interface?System.IComparable????{????????int?CompareTo(object?o);????}????public?class?TestCls:?IComparable????{????????public?TestCls()????????{????????}?????????private?int?_value;????????public?int?Value????????{????????????get?{?return?_value;?}????????????set?{?_value?=?value;?}????????}?????????public?int?CompareTo(object?o)????????{????????????//使用as模式进行转型判断????????????TestCls?aCls?=?o?as?TestCls;????????????if?(aCls?!=?null)????????????{????????????//实现抽象方法????????????return?_value.CompareTo(aCls._value);????????????}????????}????}

  • 什么是抽象类?

///?///?定义抽象类///?abstract?public?class?Animal{????//定义静态字段????static?protected?int?_id;?????//定义属性????public?abstract?static?int?Id????{????????get;????????set;????}?????//定义方法????public?abstract?void?Eat();?????//定义索引器????public?string?this[int?i]????{????????get;????????set;????}?}?///?///?实现抽象类///?public?class?Dog:?Animal{????public?static?override?int?Id????{????????get?{return?_id;}????????set?{_id?=?value;}????}?????public?override?void?Eat()????{????????Console.Write("Dog?Eats.")????}}?

  • 都不能被直接实例化,都可以通过继承实现其抽象方法。
  • 都是面向抽象编程的技术基础,实现了诸多的设计模式。

  • 接口支持多继承;抽象类不能实现多继承。
  • 接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。
  • 接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。
  • 接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。
  • 接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。?
  • 接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。

  1. 请记住,面向对象思想的一个最重要的原则就是:面向接口编程。
  2. 借助接口和抽象类,23个设计模式中的很多思想被巧妙的实现了,我认为其精髓简单说来就是:面向抽象编程。
  3. 抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。
  4. 接口着重于CAN-DO关系类型,而抽象类则偏重于IS-A式的关系;
  5. 接口多定义对象的行为;抽象类多定义对象的属性;?
  6. 接口定义可以使用public、protected、internal?和private修饰符,但是几乎所有的接口都定义为public,原因就不必多说了。
  7. “接口不变”,是应该考虑的重要因素。所以,在由接口增加扩展时,应该增加新的接口,而不能更改现有接口。
  8. 尽量将接口设计成功能单一的功能块,以.NET Framework为例,IDisposable、IDisposable、IComparable、IEquatable、IEnumerable等都只包含一个公共方法。
  9. 接口名称前面的大写字母“I”是一个约定,正如字段名以下划线开头一样,请坚持这些原则。
  10. 在接口中,所有的方法都默认为public。?
  11. 如果预计会出现版本问题,可以创建“抽象类”。例如,创建了狗(Dog)、鸡(Chicken)和鸭(Duck),那么应该考虑抽象出动物(Animal)来应对以后可能出现风马牛的事情。而向接口中添加新成员则会强制要求修改所有派生类,并重新编译,所以版本式的问题最好以抽象类来实现。
  12. 从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。
  13. 对抽象类不能使用new关键字,也不能被密封,原因是抽象类不能被实例化。
  14. 在抽象方法声明中不能使用 static 或 virtual 修饰符。

  1. FCL对集合类使用了基于接口的设计,所以请关注System.Collections中关于接口的设计实现;
  2. FCL对数据流相关类使用了基于抽象类的设计,所以请关注System.IO.Stream类的抽象类设计机制。

????public?class?Duck?:?Animal,?IAction????{????????public?Duck(string?name)????????{????????????_name?=?name;????????}????????//重载抽象方法????????public?override?void?Show()????????{????????????Console.WriteLine(_name?+?"?is?showing?for?you.");????????}????????//重载抽象属性????????public?override?string?Name????????{????????????get?{?return?_name;}????????}????????//实现接口方法????????public?void?Move()????????{????????????Console.WriteLine("Duck?also?can?swim.");????????}????}????public?class?Dog?:?Animal,?IAction????{????????public?Dog(string?name)????????{????????????_name?=?name;????????}????????public?override?void?Show()????????{????????????Console.WriteLine(_name?+?"?is?showing?for?you.");????????}????????public?override?string?Name????????{????????????get?{?return?_name;?}????????}????????public?void?Move()????????{????????????Console.WriteLine(_name?+?"?also?can?run.");????????}????}

????public?class?TestAnmial????{????????public?static?void?Main(string?[]?args)????????{????????????Animal?duck?=?new?Duck("Duck");????????????duck.MakeVoice();????????????duck.Show();????????????Animal?dog?=?new?Dog("Dog");????????????dog.MakeVoice();????????????dog.Show();????????????IAction?dogAction?=?new?Dog("A?big?dog");????????????dogAction.Move();????????}????}

  • dunai认为:抽象类是提取具体类的公因式,而接口是为了将一些不相关的类“杂凑”成一个共同的群体。至于他们在各个语言中的句法,语言细节并不是我关心的重点。
  • 的收藏也很不错。
  • 认为:所代码共用和可扩展性考虑,尽量使用Abstract Class。当然接口在其他方面的优势,我认为也不可忽视。
  • 认为:当在差异较大的对象间寻求功能上的共性时,使用接口;当在共性较多的对象间寻求功能上的差异时,使用抽象基类。

  • 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。
  • 如果创建的功能将在大范围的全异对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。
  • 如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。
  • 如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。抽象类允许部分实现类,而接口不包含任何成员的实现。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读