C# 接口的作用浅谈举例(转)
转:http://blog.csdn.net/liuqinghui1990/article/details/77171051
我初次接触接口(Interface),对接口的作用有点迷茫,C#接口中包含方法、属性、索引器和事件的声明,但常用的接口中一般就是方法和属性,然而接口中并没有方法的具体实现代码(不能提供任何成员实现),只有方法的返回类型和方法名。一个类实现了某个接口,则必须在类中包含接口中所有方法的实现代码,换句话说就是,继承自接口的类中必须包含接口中函数的实现代码。
说到这里,可能就可以看出接口的一个作用,可以对继承自接口的类起到约束作用,下面通过一个简单的例子来说明。这个例子是《C#高级编程》这本书上的,我稍微改动扩展了下。
举例:
大家都知道银行账户有很多种,像学生时代的我们一般都是储蓄卡(具有存钱、取钱、查询余额等功能),工作后有钱了可能办个黄金卡、白金卡什么的,发财了可能会升级为钻石卡等,那么一个银行账户相当于一个类,这些不同等级的银行账户都具有一些共同的基本功能(存钱、取钱等),然而等级高的账户还有一些额外功能来提升银行的服务水平,所以这些账户类中既有共同的函数,又具有差异性。
建立一个控制台应用项目(InterfaceTest2),在Program.cs中定义一个接口1,这个接口是所以银行账户必须实现的接口,包含最基本的功能。
- //账户接口1(所有银行账户类都要继承此接口)
- public interface IBankAccount
- {
- void PayIn(decimal amount);//存钱函数
- bool Withdraw(decimal amount);//取钱函数
- decimal Balance { get; }//账户余额
- }
下面定义一个普通的屌丝银行账户类(储蓄账户),命名为SaverAccount,这个屌丝账户显然必须要实现接口1,因为接口1中的功能是银行规定的所以账户都要有的。
- //账户类1,普通储蓄账户
- public class SaverAccount : IBankAccount
- {
- private decimal balance;
- public void PayIn(decimal account)
- {
- balance = balance + account;
- }
- public bool Withdraw(decimal amount)
- {
- if (balance > amount)
- {
- balance = balance - amount;
- return true;
- }
- Console.WriteLine("余额不足!");
- return false;
- }
- public decimal Balance
- {
- get
- {
- return balance;
- }
- }
- public override string ToString()
- {
- return String.Format("Saver Bank balance:",balance);
- }
- }
从屌丝账户中可以看出,SaverAccount类实现了所有继承自接口IBankAccount的方法,不然编译会报错。普通账户有存钱(PayIn)、取钱(Withdraw)和获取账户余额的方法,具体方法很简单,不在细说。
下面再定义一个接口2,接口2中包含有高级银行账户的一些额外功能。
- //账户接口2(高级银行账户要继承此接口)
- public interface IBankAdvancedAccount
- {
- void DealStartTip();//交易开始提示功能
- void DealStopTip();//交易结束提示功能
- }
接着定义一个金卡账户,显然,这个金卡账户必须实现接口1,同时还要有体现自身价值的其他方法,就是实现接口2。
- //账户类2,金卡账户
- public class GoldAccount : IBankAccount, IBankAdvancedAccount
- {
- private decimal balance;
- public void PayIn(decimal account)
- {
- balance = balance + account;
- }
- public bool Withdraw(decimal amount)
- {
- if (balance > amount)
- {
- balance = balance - amount;
- return true;
- }
- Console.WriteLine("余额不足!");
- return false;
- }
- public decimal Balance
- {
- get
- {
- return balance;
- }
- }
- public override string ToString()
- {
- return String.Format("Saver Bank balance:", balance);
- }
- public void DealStartTip()//金卡客户,在交易开始的时候,必须实现这个函数
- {
- Console.WriteLine("交易开始,请注意周围环境");
- }
- public void DealStopTip()//金卡客户,在交易结束的时候,必须实现这个函数
- {
- Console.WriteLine("交易结束,请带好您的贵重物品,欢迎下次光临!");
- }
- }
由金卡账户类GoldAccount可以看出,除了具有屌丝账户类SaverAccount所具有的存钱、取钱、查询余额的功能外,还具有一些金卡账户彰显尊贵身份的独特功能,那就是DealStartTip()和DealStopTip(),提示用户注意安全的高级功能。
下面是整个项目的代码,当然这里为了方便将接口和类都写在了一起。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace InterfaceTest2
- {
- class Program
- {
- static void Main(string[] args)
- {
- SaverAccount sa = new SaverAccount();//实例化一个普通账户
- //普通账户实现接口1,具有存钱、取钱、查看账户的功能
- sa.PayIn(1000);//普通账户能够存钱,存入1000
- sa.Withdraw(500);//普通账户能够取钱,取出500
- Console.WriteLine("普通卡账户余额:{0}",sa.Balance);
- GoldAccount ga = new GoldAccount();//实例化一个金卡账户
- ga.DealStartTip();//金卡账户还必须具有接口2的功能,为客户提供额外的服务
- ga.PayIn(10000);//金卡账户具有所有账户的基本功能 存钱10000
- ga.Withdraw(5000);//取钱500
- Console.WriteLine("金卡账户余额:{0}", ga.Balance);
- ga.DealStopTip();
- Console.ReadLine();
- }
- }
- //账户接口1(所有银行账户类都要继承此接口)
- public interface IBankAccount
- {
- void PayIn(decimal amount);//存钱函数
- bool Withdraw(decimal amount);//取钱函数
- decimal Balance { get; }//账户余额
- }
- //账户接口2(高级银行账户要继承此接口)
- public interface IBankAdvancedAccount
- {
- void DealStartTip();//交易开始提示功能
- void DealStopTip();//交易结束提示功能
- }
- //账户类1,普通储蓄账户
- public class SaverAccount : IBankAccount
- {
- private decimal balance;
- public void PayIn(decimal account)
- {
- balance = balance + account;
- }
- public bool Withdraw(decimal amount)
- {
- if (balance > amount)
- {
- balance = balance - amount;
- return true;
- }
- Console.WriteLine("余额不足!");
- return false;
- }
- public decimal Balance
- {
- get
- {
- return balance;
- }
- }
- public override string ToString()
- {
- return String.Format("Saver Bank balance:",balance);
- }
- }
- //账户类2,金卡账户
- public class GoldAccount : IBankAccount, IBankAdvancedAccount
- {
- private decimal balance;
- public void PayIn(decimal account)
- {
- balance = balance + account;
- }
- public bool Withdraw(decimal amount)
- {
- if (balance > amount)
- {
- balance = balance - amount;
- return true;
- }
- Console.WriteLine("余额不足!");
- return false;
- }
- public decimal Balance
- {
- get
- {
- return balance;
- }
- }
- public override string ToString()
- {
- return String.Format("Saver Bank balance:", balance);
- }
- public void DealStartTip()//金卡客户,在交易开始的时候,必须实现这个函数
- {
- Console.WriteLine("交易开始,请注意周围环境");
- }
- public void DealStopTip()//金卡客户,在交易结束的时候,必须实现这个函数
- {
- Console.WriteLine("交易结束,请带好您的贵重物品,欢迎下次光临!");
- }
- }
- }
由程序的入口处可以看出,屌丝用户sa只能存钱、取钱和查看余额,感觉很傻。金卡用户ga还能在交易开始和结束的时候收到银行额外的关怀(提示用户注意安全)。
由此可以想到,首先接口具有约束作用,可以限定类必须实现某些功能;其次,接口减少了代码量,便于扩展,比如银行 账户等级越高,所具有的功能就越多(实现更多的接口);再次,规范多个开发人员的代码,比如屌丝账户类由程序猿A来写,金卡账户类由程序猿B来写,那么我告诉AB这两个账户都要实现接口1,则A、B写的类中相同函数的函数名称就一致了。
Over,感觉说的很详细了,睡觉!
C# 接口的作用浅谈举例(转)的更多相关文章
- ava中Class.forName的作用浅谈
转自:http://www.jb51.net/article/42648.htm Class.forName(xxx.xx.xx) 返回的是一个类 一.首先你要明白在java里面任何class都要装载 ...
- 【接口开发】浅谈 SOAP Webserver 与 Restful Webserver 区别
接口,强大,简单,交互,跨越平台 下面简单阐述这两大接口思想 一 REST: REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性. ...
- php中普通类 接口类 抽象类 浅谈
一.普通类 1.关键词:class 类名,继承关键字extends 2.继承:只能实现单继承, 3.多态:子类继承可以实现多种功能 4.封装:类有权限机制,私有的只能自己用,受保护的可以被继承,子类 ...
- 浅谈线程池(中):独立线程池的作用及IO线程池
原文地址:http://blog.zhaojie.me/2009/07/thread-pool-2-dedicate-pool-and-io-pool.html 在上一篇文章中,我们简单讨论了线程池的 ...
- 浅谈线程池(上):线程池的作用及CLR线程池
原文地址:http://blog.zhaojie.me/2009/07/thread-pool-1-the-goal-and-the-clr-thread-pool.html 线程池是一个重要的概念. ...
- 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service ...
- 浅谈Java的反射机制和作用
浅谈Java的反射机制和作用 作者:Java大师 欢迎转载,转载请注明出处 很多刚学Java反射的同学可能对反射技术一头雾水,为什么要学习反射,学习反射有什么作用,不用反射,通过new也能创建用户对象 ...
- 示例浅谈PHP与手机APP开发,即API接口开发
示例浅谈PHP与手机APP开发,即API接口开发 API(Application Programming Interface,应用程序接口)架构,已经成为目前互联网产品开发中常见的软件架构模式,并且诞 ...
- sql之浅谈视图的作用
[数据库]☆★sql之浅谈视图的作用 在一个项目的实际开发过程中牵涉到复杂业务的时候,我们不可避免的须要使用中间表来进行数据连接,有的同学就说了,我能够採用Hibernate进行主外键进行关联啊?多对 ...
随机推荐
- Vue ---- Vuex 的第一次接触
在 Vue.js 的项目中,如果项目结构简单, 父子组件之间的数据传递可以使用 props 或者 $emit 等方式 http://www.cnblogs.com/wisewrong/p/62660 ...
- icell更改用户管理员
管理员页面是http://127.0.0.1:8080/PORTAL/tsysLoginController/admin超级管理员是http://127.0.0.1:8080/PORTAL/tsysL ...
- java实现4种内部排序
两种插入类排序: 直接插入排序: public static void insertSort(int[] arr, int len){ for(int i=1; i<len; i++){ int ...
- zookeeper客户端KeeperErrorCode = ConnectionLoss异常问题排查历险记
经过线报,说前方应用有异常,导致了可用性变差.咦!讨厌的异常,抛异常是程序猿最讨厌的事情之一. 经过收集异常信息如下 2019-06-24 10:57:41.806 ERROR [hades- ...
- spring-boot-plusV1.2.3发布,CentOS快速安装环境/构建/部署/启动项目
spring-boot-plusV1.2.3发布,CentOS快速安装环境/构建/部署/启动项目 [V1.2.3-RELEASE] 2019.09.09
- javascript——onsubmit和onreset事件 和开发中常用的方式
<head> <meta charset="UTF-8"> <title></title> <script> funct ...
- DDD 理解
DDD提倡充血模型,业务放在类中,而不是服务中,刚开始是比较不清楚的.突然明白,以前开发桌面程序的时候,不就是这样处理了吗?业务分析和代码实现一一对应.因为桌面程序没有数据库,他就是纯粹的面向对象的实 ...
- python之random库的使用以及程序的异常处理
1.random库的使用: random库是使用随机数的Python标准库从概率论角度来说,随机数是随机产生的数据(比如抛硬币),但时计算机是不可能产生随机值,真正的随机数也是在特定条件下产生的确定值 ...
- js重点——作用域——作用域分类(三)
一.作用域可以分为全局作用域,局部作用域(函数作用域)和块级作用域. 1.全局作用域 代码在程序中的任何位置都能被访问到,window对象的内置属性都拥有全局作用域. <script> v ...
- jQuery获取的dom对象和原生的dom对象有何区别
js原生获取的dom是一个对象,jQuery对象就是一个数组对象,其实就是选择出来的元素的数组集合,所以说他们两者是不同的对象类型不等价 原生DOM对象转jQuery对象 var box = docu ...