OO的接口 Interface


公司的几个朋友们对接口的概念理解的不是很清楚,所以聊一下这个话题。

首先对于 OO 来讲 接口 可以说是精华部分,所以学习OO以及学习模式都要对接口的概念很是清楚才可以。
接口所代表的就是抽象的概念,OO及Pattern 的髓也就是抽象!看看下面的这个例子好了:



English的SayHello 的实现就是“Hello”了
Chinese 的SayHello 的实现是 “你好” 了

但是我们的代码调用不是这样去写:

Chinese guowei=new Chinese();
guowei.sayHello();
English peter = new English();
peter.sayHello ();

而是这样去写

            Speak sh;  //这里定义的sp是一个接口
            Chinese guowei=new Chinese();
            English peter = new English();

            sh = guowei;
            sh.sayHello();

            sh = perter;
            sh.sayHello();

吼吼,是不是晕了呢?这么写反而越来越麻烦越来越糊涂了,不要着急,我们接着看一下:

如果是一个方法比如说

public string Speech(Speak sp)
{
    sp.SayHello();
}


那么只要p是一个People ,同时他具有SayHello,那么他就可以SayHello 了不是吗?我们不用改变Speech这个接口是不是呢?这个例子好像是演讲站在台上的是English那么就说“Hello” ,如果是Çhinese那么就说“你好”,如果将来有一天来个 Japanese 那么就应该说“こんにちは”
 

Speech(peter);  //Hello
Speech(guowei);  //你好
Speech(yito);    //こんにちは



好了,这里充分体现了抽象和多态,但有些朋友还要问是为什么不把SayHello写在People中,那不是更好吗? 当然People是本身就是抽象类,SayHello 也是抽象方法,在这个事例中的确没有什么差别,可是看过《设计模式》的朋友一定会对鸭子的那个例子记忆深刻 ,在那个事例中开发人员给禽类加了 一个飞的方法,可是到后来发现鸭子不飞,结果也要继承飞这个方法 。吼吼,这就是我们非常喜欢接口的原因,我 们很难说将来需求的变化就一定要求每个人都具有SayHello这个方法,也就是说除非我们能够保证在未来的所有继承类都具有此方法才会把它写在父类中,否则从接口继承将是非常美妙的事情。

最后要说的是我们经常可以看到很多初学OO的朋友的父类都具有很多的方法,可是Delphi,C# ,还有Java中的那个Object确是什么东东都没有,这就是说越到上层越抽象,把具体的内容和实现留给子类去实现这才是OO设计的正确做法。

[附件下载]
访客: