C# 接口应用示例
一.定义
接口描述的是可属于任何类或结构的一组相关功能,所以实现接口的类或结构必须实现接口定义中指定的接口成员。
通常用Interface关键字进行定义。
接口内部只包含方法名,属性等,不含任何访问修饰符。
二.疑问
很多像笔者这样的新手在看到接口的定义及作用后都会产生疑问:接口内部方法只有方法名我们何必去继承这个接口呢?完全可以在应用方法的类里写一个方法调用嘛,何必多此一举呢?
每个继承的类的方法内部代码依然也是不一样,继承时如果不写全继承的方法还会报错,还不如每个类自己写个方法解决呢。
这个问题让我整整找了一天的答案,如下是笔者见解。
三.代码实例
做个和银行存取款相关的实例,有这样三个银行:建行,工行,农行,有个公民同时有这三个银行的账号。
先建个接口IBank
public interface IBank
{
string Name { get; set; }
int Count { get; set; }
int InMoney(int money);
int OutMoney(int money);
}
然后分别建立三个银行的类,继承自IBank
class ICBCBank:IBank
{
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private int count;
public int Count
{
get { return count; }
set { count = value; }
}
public int InMoney(int money)
{
count += money;
return count;
}
public int OutMoney(int money)
{
count -= money;
return count;
}
}
其他两个类似这个,就不写了。内部包含Name和Count两个属性与InMoney,OutMoney两个存取钱方法。
IBank banker;
banker = new ICBCBank { Name = "ICBCBank", Count = 100 };
DrawMoney(banker);
banker = new CCBBank { Name = "CCBBank", Count = 200 };
DrawMoney(banker);
banker = new ABCBank { Name = "ABCBank", Count = 300 };
DrawMoney(banker);
private void DrawMoney(IBank banker)
{
banker.OutMoney(10);
text01.Text+=banker.Name+" "+ banker.Count.ToString()+"\n";
}
通过接口建立banker,该公民具有三个银行的账户,每次只要将其转换到某一银行去之后,即可对其在该银行内的账户进行取钱动作。
在下面DrawMoney动作中,传入参数类型为IBook,可以传入任何银行的参数,大大方便的操作处理。
假如该公民再有其他银行账户时,增加该银行类,继承IBank即可,改动很小。
接口解耦示例:(接口就是为解耦合而生)
下面有一个手机功能的接口Phone,两个品牌的手机实现了接口,还有一个用户类型的类PhoneUser,它的构造函数参数是接口类型的变量,然后在主函数中实例化某个品牌的手机,就能调用其相应的函数。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Example0329
{
class Program
{
static void Main(string[] args)
{
PhoneUser objUser = new PhoneUser(new Nokia());//这里是重点,想使用什么类型的手机实例化什么类型的手机,因为参数是接口类型的
objUser.UserPhone();
Console.ReadKey();
}
}
interface Phone
{
void Dail();//打电话
void PickUp();//接电话
void SendMsg();//发消息
void ReceiveMsg();//收消息
}
class Nokia : Phone
{
public void Dail()
{
Console.WriteLine("Nokia Dail ...");
}
public void PickUp()
{
Console.WriteLine("Nokia PickUp ...");
}
public void SendMsg()
{
Console.WriteLine("Nokia SendMsg ...");
}
public void ReceiveMsg()
{
Console.WriteLine("Nokia ReceiveMsg ...");
}
}
class HuaWei : Phone
{
public void Dail()
{
Console.WriteLine("HuaWei Dail ...");
}
public void PickUp()
{
Console.WriteLine("HuaWei PickUp ...");
}
public void SendMsg()
{
Console.WriteLine("HuaWei SendMsg ...");
}
public void ReceiveMsg()
{
Console.WriteLine("HuaWei ReceiveMsg ...");
}
}
class PhoneUser
{
private Phone _phone;
public PhoneUser(Phone objPhone)//这里参数是接口类型的构造函数
{
_phone = objPhone;
}
public void UserPhone()
{
_phone.Dail();
_phone.PickUp();
_phone.SendMsg();
_phone.ReceiveMsg();
}
}
}