我初次接触接口(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. react 入坑笔记(六) - 组件的生命周期

    React 组件生命周期 详细参考: react 组件生命周期 组件的生命周期可分为三个状态: 1.Mounting:已经挂载/插入到真实 DOM 树上: 2.Updating:正在被重新渲染: 3. ...

  2. 在access转sql server指定的转换无效

    今天继续昨天没解决的问题,还是继续报错数据库中“指定的转换无效”,看着这个错误都有点头大了,啊啊啊啊,因为无法再代码中寻找到具体点,只好在晚上继续查询 最后终于看到一条帖子说在转换的时候可能出现数据冲 ...

  3. Going from u to v or from v to u? POJ - 2762(强连通 有向最长路径)

    In order to make their sons brave, Jiajia and Wind take them to a big cave. The cave has n rooms, an ...

  4. hihoCoder #1954 : 压缩树(虚树)

    题意 有一棵 \(n\) 个节点且以 \(1\) 为根的树,把它复制成 \(m\) 个版本,有 \(q\) 次操作,每次对 \([l, r]\) 这些版本的 \(v\) 节点到根的路径收缩起来. 收缩 ...

  5. JSON.stringify的三个参数(转载)

    前段时间勾股有提到stringify是支持三个参数,刷新的了我的认知,后来查到文档才发现还真的是支持三个参数的. 参考资料: stringify stringify方法顾名思义,就是把JSON序列换, ...

  6. JS在一个数组中查找某个用户输入的值,返回对应值所在索引值

    方法有很多种 第一:直接循环,判断输出 第二:使用indexOf 正常来说,为了增加工作效率一般会选择indexOf,但是indexOf存在兼容性问题,因此最完善的写法如下 function inde ...

  7. python在windows(双版本)及linux环境下安装

    python下载 下载地址:https://www.python.org/downloads/ 可以下载需要的版本,这里选择2.7.12和3.6.2 下面第一个是linux版本,第二个是windows ...

  8. App自动化(1)--Appium-Android环境搭建

    本次笔记记录Appium-Android环境搭建,主要实现在windows上通过python编写脚本来实现模拟器上安装的app自动化测试. 主要步骤:安装node.js,配置JDK环境,配置Andro ...

  9. Kubernetes实战:目录

    一.Docker实战 Docker: 基础介绍 [一] Docker:Docker 性质及版本选择 [三] Docker:网络及数据卷设置 [四] Docker:手动制作镜像 [五] Docker:d ...

  10. To making it count.

    - How do you take your caviar, sir? 鱼子酱还要吗,先生? - No caviar for me, thanks.  Never did like it much. ...