一个例子搞明白c#接口与封装变化的内涵

一个例子搞明白c#接口与封装变化的内涵

 

接口, 可理解是一个统一的方法供外界面调用。由于接口的多态,就可以实现封装变化的需要。
封装变化:把变化装在接口里面,不让外面知道。
看例子:
[code]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EncapsulationTest
{
class Program
{
static void Main(string[] args)
{
string a = "a";
string b = "b";
MakeSvcId MI= new SlashId();
Console.WriteLine("产生的ID是:{0}",MI.MakeID(a,b));
//输出结果:a/b
Console.ReadLine();
}
}
public interface MakeSvcId
{
string MakeID(string a, string b);
}
class SlashId :MakeSvcId
{
public string MakeID(string a,string b)
{
return a + "/" + b;
}
}
class LineId : MakeSvcId
{
public string MakeID(string a,string b)
{
return a + "_" + b;
}
}
}

[/code]
功能:把两个字符串用不同的符号连接起来,做为一个ID。
代码分析:
1、定义了一个接口MakeSvcId,接口有一个方法MakeID
2、两个类SlashId 和LineId继承了接口,实现MakeID的方法,SlashId 的MakeID方法通过斜线连接字符串,LineId的MakeID方法通过下滑线连接字符串。
3、最主要的一句话:
MakeSvcId MI= new SlashId();
声明一个接口类型的变量MI,但是将SlashId的实例附值给MI。然后MI.MakeID(a,b)产生输出字符串。
这里利用了接口的多态,执行哪个MakeID方法,取决与MI在运行时被附的值,而不是声明的类型。
这句把SlashId的实例的值附给MI,所以调用SlashId类内的MakeID方法。

你现在应该明白程序大体流程了吧?但是,也许你会产生一个疑问:这么麻烦有什么意思?我直接弄两个函数,写成这样:
[code]
class prgram
{
private string MakeSlashID(string a,string b){};
private string MakeLineID(tring a,string b){};
static void Main(string[] args)
{
makeSlashID(a,b);
}
}[/code]
这样的话,如果我想换另一种生成ID的方式,直接换另一个函数不就行了吗?
乍一看,确实是这么回事,但是当你的工程很庞大的时候,到处都在调用makeSlashID函数,忽然有一天,老板说这种ID不好用,换MakeLineID吧。怎么样?傻了吧。
用接口的方式就不会出现这种情况,因为函数调用的时候,类似这两句:
[code]
MakeSvcId MI= new SlashId();
Console.WriteLine("产生的ID是:{0}",MI.MakeID(a,b));
[/code]
其它地方需要产生ID的时候,只需要MI.MakeID(a,b)就可以了。
如果老板说要换 LineID了。你只需要很悠闲的改成这样:
[code]
MakeSvcId MI= new LineId (); //注意这句
Console.WriteLine("产生的ID是:{0}",MI.MakeID(a,b));//这句根本不用变
[/code]
看到没,只改了一句话,所以调用MakeID的地方都不用变。

总体来看,接口就像各种管道的接口一样,你只需要接口怎么用,有什么功能,而不需要知道接口后面有什么。在这个例子里,我只调用接口的MakeID方法就行了。至于最终调用到了哪个实现类的方法,完全由运行时附的实例值决定。

没看明白,可以留言,文笔不好。
看明白了,不代表你就会了,闭上眼睛好好想想。

注:以上方法,只适合创建一个对象,调用不同方法的情况。如果工程中需要随时的创建和销毁对象,那么上面的模式就是失败的。因为代码会充满MakeSvcId MI= new LineId (),一旦要换成MakeSvcIdMI= new SlashId(),需要修改的地方仍然很多,增加了类间的耦合。且此时MakeSvcId MI=new SlashId()和SlashId MI= new SlashId()的差别并不大,而接口的抽象作用并没有体现出来。这时候,就要用到设计模式中的“工厂模式”了。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值