• C# 接口的作用浅谈举例(转)


    转:http://blog.csdn.net/liuqinghui1990/article/details/77171051

     我初次接触接口(Interface),对接口的作用有点迷茫,C#接口中包含方法、属性、索引器和事件的声明,但常用的接口中一般就是方法和属性,然而接口中并没有方法的具体实现代码(不能提供任何成员实现),只有方法的返回类型和方法名。一个类实现了某个接口,则必须在类中包含接口中所有方法的实现代码,换句话说就是,继承自接口的类中必须包含接口中函数的实现代码。

            说到这里,可能就可以看出接口的一个作用,可以对继承自接口的类起到约束作用,下面通过一个简单的例子来说明。这个例子是《C#高级编程》这本书上的,我稍微改动扩展了下。

    举例:

    大家都知道银行账户有很多种,像学生时代的我们一般都是储蓄卡(具有存钱、取钱、查询余额等功能),工作后有钱了可能办个黄金卡、白金卡什么的,发财了可能会升级为钻石卡等,那么一个银行账户相当于一个类,这些不同等级的银行账户都具有一些共同的基本功能(存钱、取钱等),然而等级高的账户还有一些额外功能来提升银行的服务水平,所以这些账户类中既有共同的函数,又具有差异性。

    建立一个控制台应用项目(InterfaceTest2),在Program.cs中定义一个接口1,这个接口是所以银行账户必须实现的接口,包含最基本的功能。

    [csharp] view plain copy
     
    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中的功能是银行规定的所以账户都要有的。

    [csharp] view plain copy
     
    1. //账户类1,普通储蓄账户  
    2.     public class SaverAccount : IBankAccount  
    3.     {  
    4.         private decimal balance;  
    5.   
    6.         public void PayIn(decimal account)  
    7.         {  
    8.             balance = balance + account;  
    9.         }  
    10.   
    11.         public bool Withdraw(decimal amount)  
    12.         {  
    13.             if (balance > amount)  
    14.             {  
    15.                 balance = balance - amount;  
    16.                 return true;  
    17.             }  
    18.             Console.WriteLine("余额不足!");  
    19.             return false;  
    20.         }  
    21.   
    22.         public decimal Balance  
    23.         {  
    24.             get  
    25.             {  
    26.                 return balance;  
    27.             }  
    28.         }  
    29.   
    30.         public override string ToString()  
    31.         {  
    32.             return String.Format("Saver Bank balance:",balance);  
    33.         }  
    34.     }  

    从屌丝账户中可以看出,SaverAccount类实现了所有继承自接口IBankAccount的方法,不然编译会报错。普通账户有存钱(PayIn)、取钱(Withdraw)和获取账户余额的方法,具体方法很简单,不在细说。

    下面再定义一个接口2,接口2中包含有高级银行账户的一些额外功能。

    [csharp] view plain copy
     
    1. //账户接口2(高级银行账户要继承此接口)  
    2.     public interface IBankAdvancedAccount  
    3.     {  
    4.         void DealStartTip();//交易开始提示功能  
    5.         void DealStopTip();//交易结束提示功能  
    6.     }  

    接着定义一个金卡账户,显然,这个金卡账户必须实现接口1,同时还要有体现自身价值的其他方法,就是实现接口2。

    [csharp] view plain copy
     
    1. //账户类2,金卡账户  
    2.     public class GoldAccount : IBankAccount, IBankAdvancedAccount  
    3.     {  
    4.         private decimal balance;  
    5.   
    6.         public void PayIn(decimal account)  
    7.         {  
    8.             balance = balance + account;  
    9.         }  
    10.   
    11.         public bool Withdraw(decimal amount)  
    12.         {  
    13.             if (balance > amount)  
    14.             {  
    15.                 balance = balance - amount;  
    16.                 return true;  
    17.             }  
    18.             Console.WriteLine("余额不足!");  
    19.             return false;  
    20.         }  
    21.   
    22.         public decimal Balance  
    23.         {  
    24.             get  
    25.             {  
    26.                 return balance;  
    27.             }  
    28.         }  
    29.   
    30.         public override string ToString()  
    31.         {  
    32.             return String.Format("Saver Bank balance:", balance);  
    33.         }  
    34.   
    35.         public void DealStartTip()//金卡客户,在交易开始的时候,必须实现这个函数  
    36.         {  
    37.             Console.WriteLine("交易开始,请注意周围环境");  
    38.         }  
    39.   
    40.         public void DealStopTip()//金卡客户,在交易结束的时候,必须实现这个函数  
    41.         {  
    42.             Console.WriteLine("交易结束,请带好您的贵重物品,欢迎下次光临!");  
    43.         }  
    44.     }  

    由金卡账户类GoldAccount可以看出,除了具有屌丝账户类SaverAccount所具有的存钱、取钱、查询余额的功能外,还具有一些金卡账户彰显尊贵身份的独特功能,那就是DealStartTip()和DealStopTip(),提示用户注意安全的高级功能。

    下面是整个项目的代码,当然这里为了方便将接口和类都写在了一起。

    [csharp] view plain copy
     
    1. using System;  
    2. using System.Collections.Generic;  
    3. using System.Linq;  
    4. using System.Text;  
    5.   
    6. namespace InterfaceTest2  
    7. {  
    8.     class Program  
    9.     {  
    10.         static void Main(string[] args)  
    11.         {  
    12.             SaverAccount sa = new SaverAccount();//实例化一个普通账户  
    13.             //普通账户实现接口1,具有存钱、取钱、查看账户的功能  
    14.             sa.PayIn(1000);//普通账户能够存钱,存入1000  
    15.             sa.Withdraw(500);//普通账户能够取钱,取出500  
    16.             Console.WriteLine("普通卡账户余额:{0}",sa.Balance);  
    17.   
    18.             GoldAccount ga = new GoldAccount();//实例化一个金卡账户  
    19.             ga.DealStartTip();//金卡账户还必须具有接口2的功能,为客户提供额外的服务  
    20.             ga.PayIn(10000);//金卡账户具有所有账户的基本功能 存钱10000  
    21.             ga.Withdraw(5000);//取钱500  
    22.             Console.WriteLine("金卡账户余额:{0}", ga.Balance);  
    23.             ga.DealStopTip();  
    24.   
    25.             Console.ReadLine();  
    26.         }  
    27.     }  
    28.   
    29.     //账户接口1(所有银行账户类都要继承此接口)  
    30.     public interface IBankAccount  
    31.     {  
    32.         void PayIn(decimal amount);//存钱函数  
    33.         bool Withdraw(decimal amount);//取钱函数  
    34.         decimal Balance { get; }//账户余额  
    35.     }  
    36.   
    37.     //账户接口2(高级银行账户要继承此接口)  
    38.     public interface IBankAdvancedAccount  
    39.     {  
    40.         void DealStartTip();//交易开始提示功能  
    41.         void DealStopTip();//交易结束提示功能  
    42.     }  
    43.   
    44.     //账户类1,普通储蓄账户  
    45.     public class SaverAccount : IBankAccount  
    46.     {  
    47.         private decimal balance;  
    48.   
    49.         public void PayIn(decimal account)  
    50.         {  
    51.             balance = balance + account;  
    52.         }  
    53.   
    54.         public bool Withdraw(decimal amount)  
    55.         {  
    56.             if (balance > amount)  
    57.             {  
    58.                 balance = balance - amount;  
    59.                 return true;  
    60.             }  
    61.             Console.WriteLine("余额不足!");  
    62.             return false;  
    63.         }  
    64.   
    65.         public decimal Balance  
    66.         {  
    67.             get  
    68.             {  
    69.                 return balance;  
    70.             }  
    71.         }  
    72.   
    73.         public override string ToString()  
    74.         {  
    75.             return String.Format("Saver Bank balance:",balance);  
    76.         }  
    77.     }  
    78.   
    79.     //账户类2,金卡账户  
    80.     public class GoldAccount : IBankAccount, IBankAdvancedAccount  
    81.     {  
    82.         private decimal balance;  
    83.   
    84.         public void PayIn(decimal account)  
    85.         {  
    86.             balance = balance + account;  
    87.         }  
    88.   
    89.         public bool Withdraw(decimal amount)  
    90.         {  
    91.             if (balance > amount)  
    92.             {  
    93.                 balance = balance - amount;  
    94.                 return true;  
    95.             }  
    96.             Console.WriteLine("余额不足!");  
    97.             return false;  
    98.         }  
    99.   
    100.         public decimal Balance  
    101.         {  
    102.             get  
    103.             {  
    104.                 return balance;  
    105.             }  
    106.         }  
    107.   
    108.         public override string ToString()  
    109.         {  
    110.             return String.Format("Saver Bank balance:", balance);  
    111.         }  
    112.   
    113.         public void DealStartTip()//金卡客户,在交易开始的时候,必须实现这个函数  
    114.         {  
    115.             Console.WriteLine("交易开始,请注意周围环境");  
    116.         }  
    117.   
    118.         public void DealStopTip()//金卡客户,在交易结束的时候,必须实现这个函数  
    119.         {  
    120.             Console.WriteLine("交易结束,请带好您的贵重物品,欢迎下次光临!");  
    121.         }  
    122.     }  
    123. }  

    由程序的入口处可以看出,屌丝用户sa只能存钱、取钱和查看余额,感觉很傻。金卡用户ga还能在交易开始和结束的时候收到银行额外的关怀(提示用户注意安全)。

    由此可以想到,首先接口具有约束作用,可以限定类必须实现某些功能;其次,接口减少了代码量,便于扩展,比如银行 账户等级越高,所具有的功能就越多(实现更多的接口);再次,规范多个开发人员的代码,比如屌丝账户类由程序猿A来写,金卡账户类由程序猿B来写,那么我告诉AB这两个账户都要实现接口1,则A、B写的类中相同函数的函数名称就一致了。

    Over,感觉说的很详细了,睡觉!

  • 相关阅读:
    Ubuntu16.04下安装virtualbox,配置及卸载
    机器学习1-线性回归
    python中的数据结构-链表
    Numpy 对于矩阵的操作持续更新
    ubuntu16.04 下同时打开多个终端窗口
    matlab mashgrid 函数
    站立会议04
    站立会议03
    第一次冲刺--站立会议02
    第一次冲刺--站立会议01
  • 原文地址:https://www.cnblogs.com/dare/p/8565444.html
Copyright © 2020-2023  润新知