我初次接触接口(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. vi设置行号

     首先,我们先打开一个文件,用vim 文件名 就可以直接使用vim打开   我们事先写了一些内容在这个txt里面,我们可以看到如下内容   在这里,我们可以直接敲命令, :set number 或者 ...

  2. Android P添加一个可以让system_server进程访问的hal service需要改动的sepolicy文件

    在device/sepolicy/common目录中: 修改文件attributes: attribute hal_newXX;attribute hal_newXX_client;attribute ...

  3. Python 编写一个有道翻译的 workflow 教程

    最近使用有道翻译的 workflow 总是翻译不了,可能是 appKey 失效了或者超过调用上限,所以打算自己实现一个. 创建 workflow 打开 Alfred3 的 Preferences,选择 ...

  4. 对于CAN ID的理解

    本文主要讲的是自己对于CAN ID的理解,希望对需要的人有帮助,本文以通俗的方式来理解,不涉及到具体CAN通信. 在接触CAN之前,应该接触过IIC通信,在IIC通信中,在同一条IIC通信总线上每个d ...

  5. 文件上传XSS引发的安全问题

    文件上传xss,一般都是上传html文件导致存储或者反射xss 一般后缀是html,之前疏忽了,没怎么考虑文件上传xss 如果没有 验证文件内容,却验证了后缀的情况下,使用: htm后缀: 测试代码: ...

  6. (转)Java回收对象的标记 和 对象的二次标记过程

    Java回收对象的标记 和 对象的二次标记过程 二次标记 针对这个问题,虚拟机的做法是进行两次标记,即第一次标记不在“关系网”中的对象.第二次的话就要先判断该对象有没有实现finalize()方法了, ...

  7. 在不同DPI屏幕环境下,让图标显示的尺寸保持不变,使用 LoadImage() 加载图标

    之前写过的一个客户端程序中,需要在状态栏上显示图标: 我当时使用的是:HICON LoadIcon(HINSTANCE hInstance, LPCTSTR lpIconName); 在DPI:125 ...

  8. Ansible 插件 操作介绍

    一.Ansible 插件 之 [统计任务处理时间] 在做性能优化之前首先需要做的是收集一些统计数据,这样才能为后面做的性能优化提供数据支持,对比优化前后的结果.非常不错的是,在 github 发现一个 ...

  9. plsql 永久注册码适用个版本

    注册码:Product Code:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserial Number:601769 password:xs374ca

  10. mysql 严格模式 Strict Mode说明(text 字段不能加默认或者 不能加null值得修改方法)

    mysql 严格模式 Strict Mode说明 1.开启与关闭Strict Mode方法找到mysql安装目录下的my.cnf(windows系统则是my.ini)文件 在sql_mode中加入ST ...