您的位置:首页 > 编程语言 > C#

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

2013-06-23 12:04 453 查看
一个例子搞明白c#接口与封装变化的内涵

接口, 可理解是一个统一的方法供外界面调用。由于接口的多态,就可以实现封装变化的需要。

封装变化:把变化装在接口里面,不让外面知道。

看例子:

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;

}

}

}


功能:把两个字符串用不同的符号连接起来,做为一个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方法。
你现在应该明白程序大体流程了吧?但是,也许你会产生一个疑问:这么麻烦有什么意思?我直接弄两个函数,写成这样:

class prgram

{

private string MakeSlashID(string a,string b){};

private string MakeLineID(tring a,string b){};

static void Main(string[] args)

{

makeSlashID(a,b);

}

}


这样的话,如果我想换另一种生成ID的方式,直接换另一个函数不就行了吗?

乍一看,确实是这么回事,但是当你的工程很庞大的时候,到处都在调用makeSlashID函数,忽然有一天,老板说这种ID不好用,换MakeLineID吧。怎么样?傻了吧。

用接口的方式就不会出现这种情况,因为函数调用的时候,类似这两句:

MakeSvcId MI= new SlashId();

Console.WriteLine("产生的ID是:{0}",MI.MakeID(a,b));


其它地方需要产生ID的时候,只需要MI.MakeID(a,b)就可以了。

如果老板说要换 LineID了。你只需要很悠闲的改成这样:

MakeSvcId MI= new LineId (); //注意这句

Console.WriteLine("产生的ID是:{0}",MI.MakeID(a,b));//这句根本不用变


看到没,只改了一句话,所以调用MakeID的地方都不用变。
总体来看,接口就像各种管道的接口一样,你只需要接口怎么用,有什么功能,而不需要知道接口后面有什么。在这个例子里,我只调用接口的MakeID方法就行了。至于最终调用到了哪个实现类的方法,完全由运行时附的实例值决定。
没看明白,可以留言,文笔不好。

看明白了,不代表你就会了,闭上眼睛好好想想。
注:以上方法,只适合创建一个对象,调用不同方法的情况。如果工程中需要随时的创建和销毁对象,那么上面的模式就是失败的。因为代码会充满MakeSvcId MI= new LineId (),一旦要换成MakeSvcIdMI= new SlashId(),需要修改的地方仍然很多,增加了类间的耦合。且此时MakeSvcId MI=new SlashId()和SlashId MI= new SlashId()的差别并不大,而接口的抽象作用并没有体现出来。这时候,就要用到设计模式中的“工厂模式”了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐