博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 接口的作用浅谈举例
阅读量:6094 次
发布时间:2019-06-20

本文共 6061 字,大约阅读时间需要 20 分钟。

我初次接触接口(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/ruingking/p/9801262.html

你可能感兴趣的文章
win7 vs2012/2013 编译boost 1.55
查看>>
LDAPserver的安装
查看>>
Android 通过广播来异步更新UI
查看>>
IIS7如何显示详细错误信息
查看>>
ViewPager切换动画PageTransformer使用
查看>>
meterpreter
查看>>
coco2d-x 基于视口的地图设计
查看>>
C++文件读写详解(ofstream,ifstream,fstream)
查看>>
Android打包常见错误之Export aborted because fatal lint errors were found
查看>>
Tar打包、压缩与解压缩到指定目录的方法
查看>>
新手如何学习 jQuery?
查看>>
配置spring上下文
查看>>
Python异步IO --- 轻松管理10k+并发连接
查看>>
mysql-python模块编译问题解决
查看>>
java 中getDeclaredFields() 与getFields() 的区别
查看>>
熟练掌握doc命令下的文件操作
查看>>
Oracle中drop user和drop user cascade的区别
查看>>
【Linux】linux经常使用基本命令
查看>>
Java 内存区域和GC机制
查看>>
STL之string
查看>>