转:http://blog.csdn.net/liuqinghui1990/article/details/77171051

我初次接触接口(Interface),对接口的作用有点迷茫,C#接口中包含方法、属性、索引器和事件的声明,但常用的接口中一般就是方法和属性,然而接口中并没有方法的具体实现代码(不能提供任何成员实现),只有方法的返回类型和方法名。一个类实现了某个接口,则必须在类中包含接口中所有方法的实现代码,换句话说就是,继承自接口的类中必须包含接口中函数的实现代码。

说到这里,可能就可以看出接口的一个作用,可以对继承自接口的类起到约束作用,下面通过一个简单的例子来说明。这个例子是《C#高级编程》这本书上的,我稍微改动扩展了下。

举例:

大家都知道银行账户有很多种,像学生时代的我们一般都是储蓄卡(具有存钱、取钱、查询余额等功能),工作后有钱了可能办个黄金卡、白金卡什么的,发财了可能会升级为钻石卡等,那么一个银行账户相当于一个类,这些不同等级的银行账户都具有一些共同的基本功能(存钱、取钱等),然而等级高的账户还有一些额外功能来提升银行的服务水平,所以这些账户类中既有共同的函数,又具有差异性。

建立一个控制台应用项目(InterfaceTest2),在Program.cs中定义一个接口1,这个接口是所以银行账户必须实现的接口,包含最基本的功能。

  1. //账户接口1(所有银行账户类都要继承此接口)
  2. public interface IBankAccount
  3. {
  4. void PayIn(decimal amount);//存钱函数
  5. bool Withdraw(decimal amount);//取钱函数
  6. decimal Balance { get; }//账户余额
  7. }

下面定义一个普通的屌丝银行账户类(储蓄账户),命名为SaverAccount,这个屌丝账户显然必须要实现接口1,因为接口1中的功能是银行规定的所以账户都要有的。

  1. //账户类1,普通储蓄账户
  2. public class SaverAccount : IBankAccount
  3. {
  4. private decimal balance;
  5. public void PayIn(decimal account)
  6. {
  7. balance = balance + account;
  8. }
  9. public bool Withdraw(decimal amount)
  10. {
  11. if (balance > amount)
  12. {
  13. balance = balance - amount;
  14. return true;
  15. }
  16. Console.WriteLine("余额不足!");
  17. return false;
  18. }
  19. public decimal Balance
  20. {
  21. get
  22. {
  23. return balance;
  24. }
  25. }
  26. public override string ToString()
  27. {
  28. return String.Format("Saver Bank balance:",balance);
  29. }
  30. }

从屌丝账户中可以看出,SaverAccount类实现了所有继承自接口IBankAccount的方法,不然编译会报错。普通账户有存钱(PayIn)、取钱(Withdraw)和获取账户余额的方法,具体方法很简单,不在细说。

下面再定义一个接口2,接口2中包含有高级银行账户的一些额外功能。

  1. //账户接口2(高级银行账户要继承此接口)
  2. public interface IBankAdvancedAccount
  3. {
  4. void DealStartTip();//交易开始提示功能
  5. void DealStopTip();//交易结束提示功能
  6. }

接着定义一个金卡账户,显然,这个金卡账户必须实现接口1,同时还要有体现自身价值的其他方法,就是实现接口2。

  1. //账户类2,金卡账户
  2. public class GoldAccount : IBankAccount, IBankAdvancedAccount
  3. {
  4. private decimal balance;
  5. public void PayIn(decimal account)
  6. {
  7. balance = balance + account;
  8. }
  9. public bool Withdraw(decimal amount)
  10. {
  11. if (balance > amount)
  12. {
  13. balance = balance - amount;
  14. return true;
  15. }
  16. Console.WriteLine("余额不足!");
  17. return false;
  18. }
  19. public decimal Balance
  20. {
  21. get
  22. {
  23. return balance;
  24. }
  25. }
  26. public override string ToString()
  27. {
  28. return String.Format("Saver Bank balance:", balance);
  29. }
  30. public void DealStartTip()//金卡客户,在交易开始的时候,必须实现这个函数
  31. {
  32. Console.WriteLine("交易开始,请注意周围环境");
  33. }
  34. public void DealStopTip()//金卡客户,在交易结束的时候,必须实现这个函数
  35. {
  36. Console.WriteLine("交易结束,请带好您的贵重物品,欢迎下次光临!");
  37. }
  38. }

由金卡账户类GoldAccount可以看出,除了具有屌丝账户类SaverAccount所具有的存钱、取钱、查询余额的功能外,还具有一些金卡账户彰显尊贵身份的独特功能,那就是DealStartTip()和DealStopTip(),提示用户注意安全的高级功能。

下面是整个项目的代码,当然这里为了方便将接口和类都写在了一起。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace InterfaceTest2
  6. {
  7. class Program
  8. {
  9. static void Main(string[] args)
  10. {
  11. SaverAccount sa = new SaverAccount();//实例化一个普通账户
  12. //普通账户实现接口1,具有存钱、取钱、查看账户的功能
  13. sa.PayIn(1000);//普通账户能够存钱,存入1000
  14. sa.Withdraw(500);//普通账户能够取钱,取出500
  15. Console.WriteLine("普通卡账户余额:{0}",sa.Balance);
  16. GoldAccount ga = new GoldAccount();//实例化一个金卡账户
  17. ga.DealStartTip();//金卡账户还必须具有接口2的功能,为客户提供额外的服务
  18. ga.PayIn(10000);//金卡账户具有所有账户的基本功能 存钱10000
  19. ga.Withdraw(5000);//取钱500
  20. Console.WriteLine("金卡账户余额:{0}", ga.Balance);
  21. ga.DealStopTip();
  22. Console.ReadLine();
  23. }
  24. }
  25. //账户接口1(所有银行账户类都要继承此接口)
  26. public interface IBankAccount
  27. {
  28. void PayIn(decimal amount);//存钱函数
  29. bool Withdraw(decimal amount);//取钱函数
  30. decimal Balance { get; }//账户余额
  31. }
  32. //账户接口2(高级银行账户要继承此接口)
  33. public interface IBankAdvancedAccount
  34. {
  35. void DealStartTip();//交易开始提示功能
  36. void DealStopTip();//交易结束提示功能
  37. }
  38. //账户类1,普通储蓄账户
  39. public class SaverAccount : IBankAccount
  40. {
  41. private decimal balance;
  42. public void PayIn(decimal account)
  43. {
  44. balance = balance + account;
  45. }
  46. public bool Withdraw(decimal amount)
  47. {
  48. if (balance > amount)
  49. {
  50. balance = balance - amount;
  51. return true;
  52. }
  53. Console.WriteLine("余额不足!");
  54. return false;
  55. }
  56. public decimal Balance
  57. {
  58. get
  59. {
  60. return balance;
  61. }
  62. }
  63. public override string ToString()
  64. {
  65. return String.Format("Saver Bank balance:",balance);
  66. }
  67. }
  68. //账户类2,金卡账户
  69. public class GoldAccount : IBankAccount, IBankAdvancedAccount
  70. {
  71. private decimal balance;
  72. public void PayIn(decimal account)
  73. {
  74. balance = balance + account;
  75. }
  76. public bool Withdraw(decimal amount)
  77. {
  78. if (balance > amount)
  79. {
  80. balance = balance - amount;
  81. return true;
  82. }
  83. Console.WriteLine("余额不足!");
  84. return false;
  85. }
  86. public decimal Balance
  87. {
  88. get
  89. {
  90. return balance;
  91. }
  92. }
  93. public override string ToString()
  94. {
  95. return String.Format("Saver Bank balance:", balance);
  96. }
  97. public void DealStartTip()//金卡客户,在交易开始的时候,必须实现这个函数
  98. {
  99. Console.WriteLine("交易开始,请注意周围环境");
  100. }
  101. public void DealStopTip()//金卡客户,在交易结束的时候,必须实现这个函数
  102. {
  103. Console.WriteLine("交易结束,请带好您的贵重物品,欢迎下次光临!");
  104. }
  105. }
  106. }

由程序的入口处可以看出,屌丝用户sa只能存钱、取钱和查看余额,感觉很傻。金卡用户ga还能在交易开始和结束的时候收到银行额外的关怀(提示用户注意安全)。

由此可以想到,首先接口具有约束作用,可以限定类必须实现某些功能;其次,接口减少了代码量,便于扩展,比如银行 账户等级越高,所具有的功能就越多(实现更多的接口);再次,规范多个开发人员的代码,比如屌丝账户类由程序猿A来写,金卡账户类由程序猿B来写,那么我告诉AB这两个账户都要实现接口1,则A、B写的类中相同函数的函数名称就一致了。

Over,感觉说的很详细了,睡觉!

C# 接口的作用浅谈举例(转)的更多相关文章

  1. ava中Class.forName的作用浅谈

    转自:http://www.jb51.net/article/42648.htm Class.forName(xxx.xx.xx) 返回的是一个类 一.首先你要明白在java里面任何class都要装载 ...

  2. 【接口开发】浅谈 SOAP Webserver 与 Restful Webserver 区别

    接口,强大,简单,交互,跨越平台 下面简单阐述这两大接口思想 一 REST: REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性. ...

  3. php中普通类 接口类 抽象类 浅谈

    一.普通类 1.关键词:class  类名,继承关键字extends 2.继承:只能实现单继承, 3.多态:子类继承可以实现多种功能 4.封装:类有权限机制,私有的只能自己用,受保护的可以被继承,子类 ...

  4. 浅谈线程池(中):独立线程池的作用及IO线程池

    原文地址:http://blog.zhaojie.me/2009/07/thread-pool-2-dedicate-pool-and-io-pool.html 在上一篇文章中,我们简单讨论了线程池的 ...

  5. 浅谈线程池(上):线程池的作用及CLR线程池

    原文地址:http://blog.zhaojie.me/2009/07/thread-pool-1-the-goal-and-the-clr-thread-pool.html 线程池是一个重要的概念. ...

  6. 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service ...

  7. 浅谈Java的反射机制和作用

    浅谈Java的反射机制和作用 作者:Java大师 欢迎转载,转载请注明出处 很多刚学Java反射的同学可能对反射技术一头雾水,为什么要学习反射,学习反射有什么作用,不用反射,通过new也能创建用户对象 ...

  8. 示例浅谈PHP与手机APP开发,即API接口开发

    示例浅谈PHP与手机APP开发,即API接口开发 API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞 ...

  9. sql之浅谈视图的作用

    [数据库]☆★sql之浅谈视图的作用 在一个项目的实际开发过程中牵涉到复杂业务的时候,我们不可避免的须要使用中间表来进行数据连接,有的同学就说了,我能够採用Hibernate进行主外键进行关联啊?多对 ...

随机推荐

  1. Java学习笔记-包装类

    基本数据类型对象包装类的最常见作用,就是用于基本数据类型和字符串类型之间做转换 包装类的由来 为了解决8种基本数据类型的变量不能当成Object类型变量使用的问题,Java提供了包装类(Wrapper ...

  2. Qt全局坐标和相对坐标

    QMouseEvent中两类坐标系统,一类是窗口坐标,一类是显示器坐标. QPoint QMouseEvent::pos() 返回相对这个widget(重载了QMouseEvent的widget)的位 ...

  3. 2019icpc南昌网络赛

    B. Fire-Fighting Hero (dijstra优先队列+bfs) 题意:刚开始看错题了,以为是k次dijkstra,但是wa了,后来队友指正后发现挺水的.求S到其它点的最短路的最大值an ...

  4. [CF1065F]Up and Down the Tree_tarjan_树形dp

    Up and Down the Tree 题目链接:https://www.luogu.org/problem/CF1065F 数据范围:略. 题解: 我们把每个叶子向它上面$k$个点连边,然后tra ...

  5. [CF997C]Sky Full of Stars_二项式反演_等比数列_容斥原理

    Sky Full of Stars 题目链接:http://codeforces.com/problemset/problem/997/C 数据范围:略. 题解: 首先考虑拟对象,如果至少有一行完全相 ...

  6. 【AtCoder】CODE FESTIVAL 2016 qual C

    CODE FESTIVAL 2016 qual C A - CF -- #include <bits/stdc++.h> #define fi first #define se secon ...

  7. [DEBUG] spring boot在eclipse中用maven打包成jar访问templates报500错误

    更新:打war包的话只要把html文件放在resources/templates下即可,根本不需要放外面. 配置application.yml和templates放外面这种做法,打war包确实不行. ...

  8. c++ 之private /protect/ public

    C++中public.protect.private的访问权限控制 访问权限 一个类的public成员变量.成员函数,可以通过类的成员函数.类的实例变量进行访问 一个类的protected成员变量.成 ...

  9. POJ 1015 Jury Compromise (记录路径的背包问题)

    (点击此处查看原题) 题意 为了审判某一个人,需要在n个人当中选出m个人组成陪审团,n个人中每个人都有作为起诉方的价值p和作为辩护方的价值d,为了保证公平性,要求m个人作为起诉方的价值之和P和作为辩护 ...

  10. Python基础 第四章 字典(1)

    通过名称来访问其各个值的数据结构,映射(mapping). 字典,是Python中唯一的内置映射类型,其中的值不按顺序排列,而是存储在键下.(键,可能是数.字符串.元组). 1.1 字典由 键 及其相 ...