C#接口的简单创建及其用法
我初次接触接口(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写的类中相同函数的函数名称就一致了。
C#接口的简单创建及其用法的更多相关文章
- Java集合框架中List接口的简单使用
Java集合框架可以简单的理解为一种放置对象的容器,和数学中的集合概念类似,Java中的集合可以存放一系列对象的引用,也可以看做是数组的提升,Java集合类是一种工具类,只有相同类型的对象引用才可以放 ...
- oc-12-NSString 类简单介绍及用法
// 11-[掌握]NSString 类简单介绍及用法 #import <Foundation/Foundation.h> int main(int argc, const char * ...
- 【转】MyBatis接口的简单实现原理
MyBatis接口的简单实现原理 用过MyBatis3的人可能会觉得为什么MyBatis的Mapper接口没有实现类,但是可以直接用? 那是因为MyBatis使用Java动态代理实现的接口. 这里仅仅 ...
- MyBatis接口的简单实现原理
MyBatis接口的简单实现原理 用过MyBatis3的人可能会觉得为什么MyBatis的Mapper接口没有实现类,但是可以直接用? 那是因为MyBatis使用Java动态代理实现的接口. 这里仅仅 ...
- C语言学习书籍推荐《C语言接口与实现:创建可重用软件的技术》下载
<C语言接口与实现:创建可重用软件的技术>概念清晰.实例详尽,是一本有关设计.实现和有效使用C语言库函数,掌握创建可重用C语言软件模块技术的参考指南.书中提供了大量实例,重在阐述如何用一种 ...
- 简单创建一个SpringCloud2021.0.3项目(三)
目录 1. 项目说明 1. 版本 2. 用到组件 3. 功能 2. 上俩篇教程 3. Gateway集成sentinel,网关层做熔断降级 1. 超时熔断降级 2. 异常熔断 3. 集成sentine ...
- 简单创建一个SpringCloud2021.0.3项目(二)
目录 1. 项目说明 1. 版本 2. 用到组件 3. 功能 2. 上一篇教程 3. 创建公共模块Common 4. 网关Gateway 1. 创建Security 2. Security登陆配置 3 ...
- 简单创建一个SpringCloud2021.0.3项目(一)
目录 1. 项目说明 1. 版本 2. 用到组件 3. 功能 2. 新建父模块和注册中心 1. 新建父模块 2. 新建注册中心Eureka 3. 新建配置中心Config 4. 新建两个业务服务 1. ...
- JS 中对象的简单创建和继承
对象的简单创建 1.通过对象直接量创建 比如 var obj = {}; 2.通过new 创建 比如 var obj = new Object(); // 相当于var obj = {}; var a ...
随机推荐
- react 入坑笔记(六) - 组件的生命周期
React 组件生命周期 详细参考: react 组件生命周期 组件的生命周期可分为三个状态: 1.Mounting:已经挂载/插入到真实 DOM 树上: 2.Updating:正在被重新渲染: 3. ...
- 在access转sql server指定的转换无效
今天继续昨天没解决的问题,还是继续报错数据库中“指定的转换无效”,看着这个错误都有点头大了,啊啊啊啊,因为无法再代码中寻找到具体点,只好在晚上继续查询 最后终于看到一条帖子说在转换的时候可能出现数据冲 ...
- 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 ...
- hihoCoder #1954 : 压缩树(虚树)
题意 有一棵 \(n\) 个节点且以 \(1\) 为根的树,把它复制成 \(m\) 个版本,有 \(q\) 次操作,每次对 \([l, r]\) 这些版本的 \(v\) 节点到根的路径收缩起来. 收缩 ...
- JSON.stringify的三个参数(转载)
前段时间勾股有提到stringify是支持三个参数,刷新的了我的认知,后来查到文档才发现还真的是支持三个参数的. 参考资料: stringify stringify方法顾名思义,就是把JSON序列换, ...
- JS在一个数组中查找某个用户输入的值,返回对应值所在索引值
方法有很多种 第一:直接循环,判断输出 第二:使用indexOf 正常来说,为了增加工作效率一般会选择indexOf,但是indexOf存在兼容性问题,因此最完善的写法如下 function inde ...
- python在windows(双版本)及linux环境下安装
python下载 下载地址:https://www.python.org/downloads/ 可以下载需要的版本,这里选择2.7.12和3.6.2 下面第一个是linux版本,第二个是windows ...
- App自动化(1)--Appium-Android环境搭建
本次笔记记录Appium-Android环境搭建,主要实现在windows上通过python编写脚本来实现模拟器上安装的app自动化测试. 主要步骤:安装node.js,配置JDK环境,配置Andro ...
- Kubernetes实战:目录
一.Docker实战 Docker: 基础介绍 [一] Docker:Docker 性质及版本选择 [三] Docker:网络及数据卷设置 [四] Docker:手动制作镜像 [五] Docker:d ...
- To making it count.
- How do you take your caviar, sir? 鱼子酱还要吗,先生? - No caviar for me, thanks. Never did like it much. ...