什么是.NET接口

.NET接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现,CLR允许接口可以包含事件、属性、索引器、静态方法、静态字段、静态构造函数以及常数。但是注意:C#中不能包含任何静态成员。一个类可以实现多个接口,当一个类继承某个接口时,它不仅要实现该接口定义的所有方法,还要实现该接口从其他接口中继承的所有方法。

定义方法为:

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);
  }
 }
}

什么是.NET抽象类

  .NET抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此对抽象类不能使用new关键字,也不能被密封。如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类。另外,实现抽象方法由overriding方法来实现。

  定义方法为:

///
/// 定义抽象类
///

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.")
  }
 }
  3. 相同点和不同点

  3.1 相同点

  都不能被直接实例化,都可以通过继承实现其抽象方法。

  都是面向抽象编程的技术基础,实现了诸多的设计模式。

  3.2 不同点

  接口支持多继承;抽象类不能实现多继承。

  接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。

  接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。

  接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。

  接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。

  接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。

  通过相同与不同的比较,我们只能说接口和抽象类,各有所长,但无优略。在实际的编程实践中,我们要视具体情况来酌情量才,但是以下的经验和积累,或许能给大家一些启示,除了我的一些积累之外,很多都来源于经典,我相信经得起考验。所以在规则与场合中,我们学习这些经典,最重要的是学以致用,当然我将以一家之言博大家之笑,看官请继续。

  3.3 规则与场合

  请记住,面向对象思想的一个最重要的原则就是:面向接口编程。

  借助接口和抽象类,23个设计模式中的很多思想被巧妙的实现了,我认为其精髓简单说来就是:面向抽象编程。

  抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。

  接口着重于CAN-DO关系类型,而抽象类则偏重于IS-A式的关系;

  接口多定义对象的行为;抽象类多定义对象的属性;

  接口定义可以使用public、protected、internal 和private修饰符,但是几乎所有的接口都定义为public,原因就不必多说了。

  “接口不变”,是应该考虑的重要因素。所以,在由接口增加扩展时,应该增加新的接口,而不能更改现有接口。

  尽量将接口设计成功能单一的功能块,以.NET Framework为例,IDisposable、IDisposable、IComparable、IEquatable、IEnumerable等都只包含一个公共方法。

  接口名称前面的大写字母“I”是一个约定,正如字段名以下划线开头一样,请坚持这些原则。

  在接口中,所有的方法都默认为public。

  如果预计会出现版本问题,可以创建“抽象类”。例如,创建了狗(Dog)、鸡(Chicken)和鸭(Duck),那么应该考虑抽象出动物(Animal)来应对以后可能出现风马牛的事情。而向接口中添加新成员则会强制要求修改所有派生类,并重新编译,所以版本式的问题最好以抽象类来实现。

  从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。

  对抽象类不能使用new关键字,也不能被密封,原因是抽象类不能被实例化。

  在抽象方法声明中不能使用 static 或 virtual 修饰符。

  以上的规则,我就厚颜无耻的暂定为T14条吧,写的这么累,就当一时的奖赏吧。大家也可以互通有无,我将及时修订。

  4. 经典示例

  4.1 绝对经典

  .NET Framework是学习的最好资源,有意识的研究FCL是每个.NET程序员的必修课,关于接口和抽象类在FCL中的使用,我有以下的建议:

  FCL对集合类使用了基于接口的设计,所以请关注System.Collections中关于接口的设计实现;

  FCL对数据流相关类使用了基于抽象类的设计,所以请关注System.IO.Stream类的抽象类设计机制。

  4.2 别样小菜

  下面的实例,因为是我的理解,因此给经典打上“相对”的记号,至于什么时候晋升为“绝对”,就看我在.NET追求的路上,是否能够一如既往的如此执着,因此我将把相对重构到绝对为止(呵呵)。 本示例没有阐述抽象类和接口在设计模式中的应用,因为那将是另一篇有讨论价值的文本,本文着眼与概念和原则的把握,但是真正的应用来自于具体的需求规范。

  设计结构如图所示:

1. 定义抽象类

public abstract class Animal
{
 protected string _name;
 //声明抽象属性
 public abstract string Name
 {
  get;
 }

//声明抽象方法

public abstract void Show();

//实现一般方法

public void MakeVoice()
{
 Console.WriteLine("All animals can make voice!");
}
 }
  2. 定义接口

public interface IAction
{
 //定义公共方法标签
 void Move();
}
  3. 实现抽象类和接口

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.");
 }
}
  4. 客户端实现

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();
 }
}
  5. 他山之石

  正所谓真理是大家看出来的,所以将园子里有创新性的观点潜列于此,一是感谢大家的共享,二是完善一家之言的不足,希望能够将领域形成知识,受用于我,受用于众。

  dunai认为:抽象类是提取具体类的公因式,而接口是为了将一些不相关的类“杂凑”成一个共同的群体。至于他们在各个语言中的句法,语言细节并不是我关心的重点。

  桦山涧的收藏也很不错。

  Artech认为:所代码共用和可扩展性考虑,尽量使用Abstract Class。当然接口在其他方面的优势,我认为也不可忽视。

  shenfx认为:当在差异较大的对象间寻求功能上的共性时,使用接口;当在共性较多的对象间寻求功能上的差异时,使用抽象基类。

  最后,MSDN的建议是:

  如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。

  如果创建的功能将在大范围的全异对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。

  如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。

  如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。抽象类允许部分实现类,而接口不包含任何成员的实现。

  6. 结论

  .NET接口和抽象类,是论坛上、课堂间讨论最多的话题之一,之所以将这个老话题拿出来再议,是因为从我的体会来说,深刻的理解这两个面向对象的基本内容,对于盘活面向对象的抽象化编程思想至关重要。本文基本概况了接口和抽象类的概念、异同和使用规则,从学习的观点来看,我认为这些总结已经足以表达其核心。但是,对于面向对象和软件设计的深入理解,还是建立在不断实践的基础上,Scott说自己每天坚持一个小时用来写Demo,那么我们是不是更应该勤于键盘呢。对于接口和抽象类,请多用而知其然,多想而知其奥吧。

.NET之对接口和抽象类相关推荐

  1. 9.6-OOP语言 对接口和抽象类的理解

    抽象类主要用作对象系列的基类,这些对象共享某些主要特征,例如共同的目的和结构:接口则主要用于类,这些类存在根本性的区别,但仍可以完成某些相同的任务. 书中举到的一个例子个人认为非常有助于理解,放在这里 ...

  2. Java 接口和抽象类可以被new么?

    背景: 最近有同事跟我说了他面试时遇到的问题,考官问:"接口和抽象类可以被new嘛?".这可能不是考官的原话,但是据他表达考官大概就是这个意思了.听到这个问题,我的第一反应是肯定不 ...

  3. (读书随笔)接口和抽象类的一些区别总结

    自己写的笔记 最近看"图灵"出版的一本<Java设计模式>的书,小感慨了一下,还是外国人写的好,对接口和抽象类进行一些总结 1.一个类可以实现多个接口,但是只能扩展一个 ...

  4. Java 接口和抽象类可以被new么?——顺便总结内部类

    转载:https://blog.csdn.net/hackersaillen/article/details/47281549 背景: 最近有同事跟我说了他面试时遇到的问题,考官问:"接口和 ...

  5. 为什么派生的子类报错不能实例化抽象类_C# 接口与抽象类实例分析

    初学者在学习C#过程中,对面向对象概念,接口.抽象等关系往往难以准确理解.本文主要通过简单举例对接口.抽象类等概念进行简单说明,希望对初学者有所帮助,如有不对之处欢迎批评指正. 接口interface ...

  6. 自学Java如何入门?看完教你秒懂Java接口 抽象类区别!

    在面向对象编程中,抽象类和接口是两个经常被用到的语法概念,是面向对象四大特性,以及很多设计模式.设计思想.设计原则编程实现的基础.本文将主要讲解二者的区别 什么是抽象类和接口? 区别在哪里? 不同的编 ...

  7. java抽象类和接口有什么意义

    用了java这么久,对接口和抽象类使用一直很模糊.为什么接口和抽象类不能实例化,为什么接口可以多个实现而抽象类只能单继承,特别是java8之后,抽象类和接口里面都可以写代码后,就更加分不清了,今天重新 ...

  8. Java接口、基类、抽象类详解(图解接口、继承和实现、基类和抽象类的区别等)——Java基础系列

    文章目录 前言 总览(必看) 一.接口是"契约" 二.接口实例--Servlet接口 三.抽象标识符abstract和抽象类 四.基类作为"辅助" 求支持 前言 ...

  9. Java:接口和抽象类,傻傻分不清楚?

    再来聊聊接口和抽象类. 01.抽象类和接口的区别 来看网络上对接口的一番解释: 接口(英文:Interface),在 Java 编程语言中是一个抽象类型,是抽象方法的集合.一个类通过继承接口的方式,从 ...

最新文章

  1. OpenStack 2018 年终盘点
  2. 大数据在银行业的应用场景
  3. 【错误记录】Google Play 上架报错 ( APK 大小 | 目标 API 级别 | Google Play 帮助文档 )
  4. Java与C#比较,哪个语言更是适合你?
  5. VTK:几何对象之Frustum
  6. SAP Fiori Elements - object detail batch roundtrip triggered by binding property in embedded xml vie
  7. A20修改串口设备文件
  8. 【ZOJ - 4020 】Traffic Light (bfs,分层图)
  9. 系统类扩展方法,实现对所有类或某种类扩展自定义方法
  10. 在framework和hal添加log
  11. 9.Tideways和xhgui
  12. 锐捷服务器端口映射教程,锐捷路由器端口映射,路由器端口映射
  13. DELMIA人机工程 ---- 二次开发 第一篇:开发指南
  14. 仿钉钉流程设计(.net工作流)之普通流程模板配置
  15. 工业相机镜头相关知识整理
  16. 多个blockquote_换句话说:使用blockquote,cite和q元素
  17. PM_09 十大管理之项目人力资源管理(六)
  18. 裸眼3D大屏,打破人们的认知
  19. Linux进程(二):生命周期
  20. 微信小游戏wx.getFileSystemManager文件写入

热门文章

  1. PTA 天梯赛习题集 L1-059 敲笨钟
  2. IDEA中Free Mybatis plugin插件的使用
  3. Excel字符串截取
  4. 教你如何使用Flutter和原生App混合开发
  5. 随e 听教师助手 随e听教师助手 英语课件试卷制作 英语学习软件
  6. 2.5代指纹追踪技术—跨浏览器指纹识别
  7. 3年没写线段树题了,今天帮小学弟水了棵线段树,想不到现在依然有看到Accepted的鸡冻哈哈哈
  8. 最近出现的几篇视觉和激光雷达SLAM论文介绍
  9. 判断点在三角形内部方法
  10. win7系统使用的音响有杂音的处理--win10专业版