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,感觉说的很详细了,睡觉!
转载于:https://www.cnblogs.com/dare/p/8565444.html
C# 接口的作用浅谈举例(转)相关推荐
- C# 接口的作用浅谈举例
我初次接触接口(Interface),对接口的作用有点迷茫,C#接口中包含方法.属性.索引器和事件的声明,但常用的接口中一般就是方法和属性,然而接口中并没有方法的具体实现代码(不能提供任何成员实现), ...
- KVO(NSKeyValueObserving)、KVC(NSKeyValueCoding)作用浅谈
[iOS] KVO(NSKeyValueObserving).KVC(NSKeyValueCoding)作用浅谈 在很多时候接触到很多地方都有对KVC,KVO的描述,但是都是一笔带过.只知道这是Obj ...
- JDK与JRE的关系和path的作用浅谈
JDK与JRE的关系和path的作用浅谈 摘要:JDK与JRE的关系以及path的配置对于初学者是要明白的问题,那么具体的JDK与JRE的关系是什么呢?那么本文讲给你简单介绍. 标签:JDK与JRE关 ...
- 充分利用计算机在教学中的作用,浅谈多媒体在教学中的作用
浅谈多媒体在教学中的作用 时间:2018-04-14 来源:未知 作者:admin 点击:次 核心提示:浅谈多媒体在小学数学教学中的作用 摘要 在数学课堂中合理运用多媒体技术能充分调动学生的学习积极, ...
- 小学语文教学计算机的作用,浅谈多媒体信息技术在小学语文教学中的作用
浅谈多媒体信息技术在小学语文教学中的作用 时间: 2013-10-29 栏目: 浅谈多媒体信息技术在小学语文教学中的作用 浅谈多媒体信息技术在小学语文教学中的作用 贵州省平塘县油岜小学 冷华超 [摘 ...
- 酒店前厅计算机的作用,浅谈智能化对酒店前厅员工的服务质量和影响
摘 要:随着信息技术.网络技术等的广泛应用,社会智能化表现越来越突出.从智能化的具体发展和应用分析来看,其不仅改变了人们的生活方式,使的人们的生活更加的便捷,同时也对行业发发展等产生了非常显著的影响. ...
- 谈计算机知识对学生的作用,浅谈计算机在教学中的作用
浅谈计算机在教学中的作用 时间:2017-07-19 08:54:57 浅谈计算机在教学中的作用 计算机基础教育的教学目标是使学生掌握计算机的基本知识和操作技能,把计算机作为获取和交流信息的工具,为学 ...
- 计算机教学在教学方面的作用,浅谈信息技术在教学中的重要作用
浅谈信息技术在教学中的重要作用 时间:2018-06-06 来源:未知 作者:admin 点击:次 核心提示:浅谈信息技术在小学语文教学中的重要作用 摘要:小学生的年龄特点,决定了他们对客观事物的认识 ...
- 数学在计算机科学发展中起到的作用,浅谈数学在计算机科学及应用中的作用_计算机毕业论文...
全文字数:3518 浅谈数学在计算机科学及应用中的作用 [摘要] 本文简要探讨数学在计算机科学及应用中的作用,初步了解计算机的工作及其原理.数学是计算机发展的基础,几个重要的数学分支在计算机发展中起着 ...
最新文章
- Exchange 分析器工具介绍及案例分析
- 2.7 usb摄像头之usb摄像头描述符打印
- sdut-1118 C语言实验——从大到小输出a、b、c(选择结构)
- IE这回在css flex中扳回一局?
- 让前端与后端异步起来
- 重学java基础第十二课:计算机语言发展史
- java贪吃蛇撞壁转弯代码_java贪吃蛇demo
- mysql not exists优化_MySQL优化--NOT EXISTS和LEFT JOIN方式差异
- EntityFramework之迁移操作(五)
- vue怎么自己创建组件并引用_如何在组件库项目内直接引用vue-cli生成的组件库文件...
- 利用ant脚本 自动构建svn增量/全量 系统程序升级包
- One-hot 编码/TF-IDF 值来提取特征,LAD/梯度下降法(Gradient Descent),Sigmoid
- AI 机器视觉/计算机视觉系统在行业中的应用
- 揭开迷雾,来一顿美味的Capsule盛宴
- 百度竞价的五个基本特征!
- 商标变更的重要性不及时变更的损失
- 接入微信universal link微信校验不通过
- CSS3之多列布局columns学习
- C++类成员函数作回调函数
- 北京超融合服务器虚拟化软件,选择超融合一体机还是超融合纯软件?
热门文章
- 给定n,a求最大的k,使n!可以被a^k整除但不能被a^(k+1)整除。
- libgdx学习记录18——Box2d物理引擎
- hdu4525 威威猫系列故事——吃鸡腿
- 如何将字符串前后的空白去除(C/C++) (STL)
- 学Android开发 这19个开发工具助你顺风顺水
- Android Studio相见恨晚的操作锦集
- iOS安全攻防(十七):Fishhook
- SAS 2.0:中端理想“零距离”?
- Angular2封装拖拽指令
- 《中国人工智能学会通讯》——11.51 基于幻象技术的异质人脸图像合成