我初次接触接口(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写的类中相同函数的函数名称就一致了。

C#接口的简单创建及其用法的更多相关文章

  1. Java集合框架中List接口的简单使用

    Java集合框架可以简单的理解为一种放置对象的容器,和数学中的集合概念类似,Java中的集合可以存放一系列对象的引用,也可以看做是数组的提升,Java集合类是一种工具类,只有相同类型的对象引用才可以放 ...

  2. oc-12-NSString 类简单介绍及用法

    // 11-[掌握]NSString 类简单介绍及用法 #import <Foundation/Foundation.h> int main(int argc, const char * ...

  3. 【转】MyBatis接口的简单实现原理

    MyBatis接口的简单实现原理 用过MyBatis3的人可能会觉得为什么MyBatis的Mapper接口没有实现类,但是可以直接用? 那是因为MyBatis使用Java动态代理实现的接口. 这里仅仅 ...

  4. MyBatis接口的简单实现原理

    MyBatis接口的简单实现原理 用过MyBatis3的人可能会觉得为什么MyBatis的Mapper接口没有实现类,但是可以直接用? 那是因为MyBatis使用Java动态代理实现的接口. 这里仅仅 ...

  5. C语言学习书籍推荐《C语言接口与实现:创建可重用软件的技术》下载

    <C语言接口与实现:创建可重用软件的技术>概念清晰.实例详尽,是一本有关设计.实现和有效使用C语言库函数,掌握创建可重用C语言软件模块技术的参考指南.书中提供了大量实例,重在阐述如何用一种 ...

  6. 简单创建一个SpringCloud2021.0.3项目(三)

    目录 1. 项目说明 1. 版本 2. 用到组件 3. 功能 2. 上俩篇教程 3. Gateway集成sentinel,网关层做熔断降级 1. 超时熔断降级 2. 异常熔断 3. 集成sentine ...

  7. 简单创建一个SpringCloud2021.0.3项目(二)

    目录 1. 项目说明 1. 版本 2. 用到组件 3. 功能 2. 上一篇教程 3. 创建公共模块Common 4. 网关Gateway 1. 创建Security 2. Security登陆配置 3 ...

  8. 简单创建一个SpringCloud2021.0.3项目(一)

    目录 1. 项目说明 1. 版本 2. 用到组件 3. 功能 2. 新建父模块和注册中心 1. 新建父模块 2. 新建注册中心Eureka 3. 新建配置中心Config 4. 新建两个业务服务 1. ...

  9. JS 中对象的简单创建和继承

    对象的简单创建 1.通过对象直接量创建 比如 var obj = {}; 2.通过new 创建 比如 var obj = new Object(); // 相当于var obj = {}; var a ...

随机推荐

  1. LeetCode_p150_逆波兰表达式计算/后缀表达式计算

    有效的运算符包括 +, -, *, / .每个运算对象可以是整数,也可以是另一个逆波兰表达式. 说明: 整数除法只保留整数部分. 给定逆波兰表达式总是有效的.换句话说,表达式总会得出有效数值且不存在除 ...

  2. “纽劢科技杯”第十六届同济大学程序设计竞赛暨上海邀请赛同步赛 J-张老师的游戏

    传送门 题目描述     在空闲时间,张老师习惯性地和菜哭武玩起了取石子游戏,这次的游戏规则有些不同,在他们面前有n堆石子,其中,第i堆石子的个数为a[i],现在制定规则如下:     从张老师开始, ...

  3. P3366 【模板】最小生成树

    原题链接 https://www.luogu.org/problemnew/show/P3366 一道最小生成树的模板题...... 昨天刚学最小生成树,wz大佬讲的一塌糊涂井然有序,所以我们今天做起 ...

  4. 【集训队互测2015】Robot

    题目描述 http://uoj.ac/problem/88 题解 维护两颗线段树,维护最大值和最小值,因为每次只有单点查询,所以可以直接在区间插入线段就可以了. 注意卡常,不要写STL,用链表把同类修 ...

  5. 将gbk字符串转换成utf-8,存储到注册表中后,再次从注册表读取转换成gbk,有问题!!!

    char *a = "新2新"; printf("gbk:'%s'\n", a); int ii; ; ii < strlen(a); ii++) { p ...

  6. TODO springboot学习笔记

    学习中,是在是搞不懂是什么狗屎....

  7. Luogu P4716 【模板】最小树形图

    题目链接\(Click\) \(Here\) 不知道有什么用的一个东西.本来不打算再大量扩知识点了但还是学一下好了,反正也不难. 原理:树上父亲唯一,每次选最短的父边. 此时会有两类情况: 就这样正常 ...

  8. 我的mybatis从oracle迁移转换mysql的差异【原】

    仅此作为笔记 分页差异 oracle <select id="select" parameterClass="java.util.Map" resultC ...

  9. RSA加密传输代码示例

    RSA加密传输代码示例 涉及敏感数据的传输,双方最好约定使用加密解密.那RSA非对称加密就大有作为了.服务端可以保留自己的私钥,发给客户端对应的公钥.这样就可以互相加解密了.php中rsa加解密实现: ...

  10. maven配置阿里镜像仓库

    打开maven的配置文件(windows机器一般在maven安装目录的conf/settings.xml),在<mirrors></mirrors>标签中添加mirror子节点 ...