C#中接口和抽象类的区别

什么是接口?

用来定义一种程序的协定。实现接口的类或者结构要与接口的定义严格一致。有了这个协定,就可以抛开编程语言的限制(理论上)。C#接口可以从多个基接口继承,而类或结构可以实现多个接口。C#接口可以包含方法、属性、事件和索引器。接口本身不提供它所定义的成员的实现。接口只指定实现该接口的类或接口必须提供的成员。

如何使用接口?

例如:

  1. <span style="font-family:KaiTi_GB2312;">using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace 用了抽象模式的数据访问程序
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. User user = new User();
  12. Department dept = new Department();
  13. //Ifactory factory =new SqlserverFactory();
  14. IFactory factory = new AccessFactory();
  15. //此时已经与具体的数据库访问解除了依赖
  16. IUser iu = factory.CreateUser();
  17. iu.Insert(user);
  18. iu.GetUser(1);
  19. IDepartment id = factory.CreateDepartment();
  20. id.Insert(dept);
  21. id.GetDepartment(1);
  22. Console.Read();
  23. }
  24. }
  25. class User
  26. {
  27. private int id;
  28. public int ID
  29. {
  30. get { return id; }
  31. set { id = value; }
  32. }
  33. }
  34. class Department
  35. {
  36. private int id;
  37. public int ID
  38. {
  39. get { return id; }
  40. set { id = value; }
  41. }
  42. }
  43. //IDepartment接口,用于客户端访问,解除与具体数据库访问的耦合。
  44. interface IDepartment
  45. {
  46. void Insert(Department department);
  47. Department GetDepartment(int id);
  48. }
  49. //SqlserverDepartment类,用于访问SQL Server的Department
  50. class SqlserverDepartment : IDepartment
  51. {
  52. public void Insert(Department department)
  53. {
  54. Console.WriteLine("在SQL Server 中给Department表增加一条记录");
  55. }
  56. public Department GetDepartment(int id)
  57. {
  58. Console.WriteLine("在SQL Server 中根据ID得到Department表一条记录");
  59. return null;
  60. }
  61. }
  62. //Access类,用于访问Access的Department
  63. class AccessDepartment : IDepartment
  64. {
  65. public void Insert(Department department)
  66. {
  67. Console.WriteLine("在Access 中给Department表增加一条记录");
  68. }
  69. public Department GetDepartment(int id)
  70. {
  71. Console.WriteLine("在Access中根据ID得到Department表一条记录");
  72. return null;
  73. }
  74. }
  75. //IUser接口,用于客户端访问,解除与具体数据库访问的耦合
  76. interface IUser
  77. {
  78. void Insert(User user);
  79. User GetUser(int id);
  80. }
  81. //SqlserverUser类,用于访问SQL Server的User
  82. class SqlserverUser : IUser
  83. {
  84. public void Insert(User user)
  85. {
  86. Console.WriteLine("在SQL Server 中给User表增加一条记录");
  87. }
  88. public User GetUser(int id)
  89. {
  90. Console.WriteLine("在SQL Server中根据ID得到User表一条记录");
  91. return null;
  92. }
  93. }
  94. //Access类,用于访问Access的User
  95. class AccessUser : IUser
  96. {
  97. public void Insert(User user)
  98. {
  99. Console.WriteLine("在Access中给User表增加一条记录");
  100. }
  101. public User GetUser(int id)
  102. {
  103. Console.WriteLine("在Access中根据得到User表一条记录");
  104. return null;
  105. }
  106. }
  107. //IFactory 接口,定义一个创建访问Department表对象的抽象的工厂接口
  108. interface IFactory
  109. {
  110. IUser CreateUser();
  111. //增加的接口方法
  112. IDepartment CreateDepartment();
  113. }
  114. //SqlServerFactory类,实现IFactory接口,实例化SqlserverUser和SqlserverDepartment
  115. class SqlserverFactory : IFactory
  116. {
  117. public IUser CreateUser()
  118. {
  119. return new SqlserverUser();
  120. }
  121. public IDepartment CreateDepartment()
  122. {
  123. return new SqlserverDepartment();
  124. }
  125. }
  126. //AccessFactory类,实现IFactory接口,实例化AccessUser和AccessDepartment
  127. class AccessFactory : IFactory
  128. {
  129. public IUser CreateUser()
  130. {
  131. return new AccessUser();
  132. }
  133. public IDepartment CreateDepartment()
  134. {
  135. return new AccessDepartment();
  136. }
  137. }
  138. }
  139. </span>

什么是抽象类?

抽象类是包含抽象方法的类。那么什么又是抽象方法呢?抽象方法是没有方法内容的,只有一个方法名和参数列表的方法。并以;结尾。为了标注他的与众不同,在他的返回类型前加abstract。并在class前加abstract。

简言之,由abstract修饰的方法和类就是抽象的方法和类。

如何使用抽象类,抽象方法,和怎样实现抽象方法?

例如:

[html] view plain copy

  1. <span style="font-size:18px;"><span style="font-family:KaiTi_GB2312;">using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace 状态模式结构图
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. //设置Context的初始状态为ConcreteStateA
  12. Context c = new Context(new ConcreteStateA());
  13. //不断的请求,同时更新状态
  14. c.Request();
  15. c.Request();
  16. c.Request();
  17. c.Request();
  18. Console.Read();
  19. }
  20. }
  21. //Context类,维护一个COncreteState子类的实例,这个实例定义当前的状态
  22. class Context
  23. {
  24. private State state;
  25. //定义Context的初始状态
  26. public Context(State state)
  27. {
  28. this.state = state;
  29. }
  30. //可读写的状态属性,用于读取当前状态和设置新状态
  31. public State State
  32. {
  33. get { return state; }
  34. set
  35. {
  36. state = value;
  37. Console.WriteLine("当前状态:" + state.GetType().Name);
  38. }
  39. }
  40. //对请求做处理,并设置下一状态
  41. public void Request()
  42. {
  43. state.Handle(this);
  44. }
  45. }
  46. //抽象状态类State,定义一个接口以封装与Context的一个特定状态相关的行为
  47. abstract class State
  48. {
  49. public abstract void Handle(Context context);
  50. }
  51. //ConcreteState类,具体状态,每一个子类实现一个与Context的一个状态相关的行为
  52. class ConcreteStateA : State
  53. {
  54. public override void Handle(Context context)
  55. {
  56. //设置ConcreteStateA的下一个状态是ConcreteStateB
  57. context.State = new ConcreteStateB();
  58. }
  59. }
  60. class ConcreteStateB : State
  61. {
  62. public override void Handle(Context context)
  63. {
  64. //设置ConcreteStateB的下一个状态是ConcreteStateA
  65. context.State = new ConcreteStateA();
  66. }
  67. }
  68. }
  69. </span></span>

接口和抽象类混淆了其实也不能全怪我,因为它们确实有相似之处:

接口与抽象类的相同点:

1、不能实例化;

2、包含未实现的方法声明;

3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);

不过它们还是有很大的区别的

接口与抽象类的区别:

1.类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口只是一个行为的规范或规定

2.接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;

3.一个类一次可以实现若干个接口,但是只能扩展一个父类(接口是可以继承接口的,而且一个接口可以继承多个接口
这里与类的继承有所区别,类只能继承一个父类,而接口可以继承多个父类,这些父类必须是接口。)

4.接口可以用于支持回调,而继承并不具备这个特点.

5.抽象类不能被密封。

6.抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的.

7.(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上。

8.抽象类实现了oop中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的座位子类去实现。

9.好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。

10.尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们全部加载到栈中!后果可想而知.(结合堆栈原理理解)。同时,有心的朋友可以留意到微软在构建一个类时,很多时候用到了对象组合的方法。比如asp.net中,Page类,有Server Request等属性,但其实他们都是某个类的对象。使用Page类的这个对象来调用另外的类的方法和属性,这个是非常基本的一个设计原则。

11.如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法.

什么时候使用抽象类和接口

1. 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。

2.如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口。

3.如果要设计大的功能单元,则使用抽象类.如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。

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

下面有几个比喻说的很贴切,大家从中也许也会领悟很多

1.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。

2.就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音(接口污染))。

时间: 2024-10-15 08:43:59

C#中接口和抽象类的区别的相关文章

Java中接口和抽象类的区别与联系

Java中接口和抽象类的区别与联系 1. 抽象类: (1).概念:抽象类是对一种事物的抽象,即对类抽..抽象类是对整个类整体进行抽象,包括属性.行为.Java抽象类和Java接口一样,都用来声明一个新的类型.并且作为一个类型的等级结构的起点. (2).格式: public abstract class abstractDemo{ /**属性*/ private String name; /**方法*/ public abstract void fun(); } (3).说明: A:抽象类中不一定

C#中接口与抽象类的区别

接口与抽象类是面试中经常会考到的点,容易混淆.首先了解下两者的概念: 一.抽象类:      抽象类是特殊的类,只是不能被实例化:除此以外,具有类的其他特性:重要的是抽象类可以包括抽象方法,这是普通类所不能的.抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们.另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们. 二.接口: 接口是引用类型的,类似于类,和抽象类的相似之处有三点: 1.不能实例化: 2.包含未实现的方法声明: 3

Java中接口和抽象类的区别?

抽象类 抽象类必须用 abstract 修饰,子类必须实现抽象类中的抽象方法,如果有未实现的,那么子类也必须用 abstract 修饰.抽象类默认的权限修饰符为 public,可以定义为 public 或 procted,如果定义为 private,那么子类则无法继承.抽象类不能创建对象 抽象类和普通类的区别 抽象类必须用public.procted 修饰(如果为private修饰,那么子类则无法继承,也就无法实现其抽象方法).默认缺省为 public 抽象类无法创建对象 如果一个子类继承抽象类

java中接口与抽象类的区别

接口和抽象类的共同特征如下: 接口和抽象类都不能被实例化,位于继承树的顶端,用于被其他类实现和继承. 接口和抽象类都可以包含抽象的方法,实现接口的类或者继承抽象类的类都必须实现这些抽象的方法. 区别:二者的主要区别在于他们存在的目的不同,即设计的目的不同. 接口作为系统与外界交互的窗口,接口体现的是一种规范. 抽象类作为系统中多个子类的共同父类,抽象类体现的是一种模板式设计. 我们最关注的还是二者用法的区别: (1)接口里只能包含抽象方法和默认方法,不能实现普通方法.抽象类完全可以包含普通方法.

java中接口和抽象类的区别

抽象类: 1.用abstract表示 2.里面有一个或多个抽象方法,在方法前加abstract,抽象类中也可以没有抽象方法 3.抽象类用extends继承,并且必须重写抽象方法 接口 1.用implement表示 2.接口是极度抽象的类,所有方法都是抽象的,都需要进行重写 接口的作用:解决java中的单继承问题,一个类可以实现多个接口,但只能有一个父类 共同点:都不能被实例化

2.35 Java基础总结①抽象②接口③设计抽象类和接口的原则④接口和抽象类的区别

java基础总结①抽象②接口③设计抽象类和接口的原则④接口和抽象类的区别 一.抽象 abstract作用:不能产生对象,充当父类,强制子类正确实现重写方法和类相比仅有的改变是不能产生对象,其他的都有,包括构造.属性等等任何一个类只要有一个抽象的方法就成了抽象类 抽象方法 public abstract A();①方法是抽象的,这个类也是抽象的:②子类必须重写抽象方法,除非子类也是抽象类 抽象类可以没有抽象方法,但一般不这么设计 二.接口 interface 接口也是Java的一种引用数据类型(J

Java知多少(40)接口和抽象类的区别

类是对象的模板,抽象类和接口可以看做是具体的类的模板. 由于从某种角度讲,接口是一种特殊的抽象类,它们的渊源颇深,有很大的相似之处,所以在选择使用谁的问题上很容易迷糊.我们首先分析它们具有的相同点. 都代表类树形结构的抽象层.在使用引用变量时,尽量使用类结构的抽象层,使方法的定义和实现分离,这样做对于代码有松散耦合的好处. 都不能被实例化. 都能包含抽象方法.抽象方法用来描述系统提供哪些功能,而不必关心具体的实现. 下面说一下抽象类和接口的主要区别. 1) 抽象类可以为部分方法提供实现,避免了在

Java中接口和抽象类的比较

Java中接口和抽象类的比较-2013年5月写的读书笔记摘要 1. 概述 接口(Interface)和抽象类(abstract class)是 Java 语言中支持抽象类的两种机制,是Java程序设计使用多态性的基础[[1]].(在面向对象语言中,接口的多种不同的实现方式即为多态.多态性是允许你将父对象设置成为和一个或更多的他的子对象的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作(摘自"Delphi4编程技术内幕").简单的说,就是一句话:允许将子类类型的

接口、接口优点、接口的属性和方法特性、接口与继承的区别、接口与抽象类的区别、匿名实现类、JDK1.8新特性、打印类名称

接口里的属性,必须是公共的/默认的&静态的&Final&初始化后的属性: 接口里所有方法都是抽象的. 接口和继承---先天有的用继承,后天学习的用接口: 接口特性-------- 1.接口不可以被实例化: 2.实现类必须实现接口中所有方法,否则实现类必须是抽象类 3.实现类可以实现多个接口,来弥补Java不能多继承: 4.接口中的变量都是静态常量:(静态的-可以通过类的名字点-直接调用:) ----------------------------------------------