我看《我是谁?[C#]》
这几天正在学习有关接口的知识,看到博客园期刊上刊登了一篇名为《我是谁?[C#]》的文章,作者用生动有趣的语言对接口进行了深入的分析,感觉非常不错。看完后也想发表一点自己的看法,但是没法在期刊上回复,就写在这儿了。
接口是一个公开的约定,利用接口可以实现与未知的代码用一种通用的方法进行通信。接口定义了自己的成员却不提供任何实现,当然也无法被实例化。
当一个类继承某个接口时,这个类就理所当然的有了实现接口所规定的全部成员的义务。至于这个类还能不能干点其他的事,接口非常开明,它可能在说“这些我不管,只要你能干完我要求的活就行。”,所以,从接口继承的类完全可以具有其他非常多的功能,而这一切甚至与接口没有关系,正如原文示例中的N()。
再回到原文:
有一个 interface ABC 包括了如下的方法 M():
另外有个类 Class1 继承了 ABC 并且拥有自己的方法 N():
看看M()到底属于谁,从Class1的代码看,毫无疑问,M()是Class1的一个公共方法,比较特殊的是,M()比较能干,它同时担负起了为ABC实现M()的义务。
当我们声明:ABC t = new Class1(); 的时候,我们一定是想使用ABC的功能,而不是Class1,否则我想一定会改成这样的: Class1 t=new Class1(); 虽然我们确确实实new了一个Class1,但我们new出来的对象还同时是ABC,Class1只是在幕后为ABC做了实现而已,至于Class1还能做什么,我们根本无从得到。开明的ABC自然不会把Class1的功能全盘托出,否则你直接找Class1得了。
事实上,我们完全可以让Class1的一个方法去实现ABC,而这个方法不必公开,Class1甚至可以拥有一个同名的方法M()去做自己的事情。看下面的代码:
2{
3 public void M()
4 {
5 Console.WriteLine("Now we are in Class1, But using method which not inherit from Interface ABC ");
6 }
7
8 void ABC.M()
9 {
10 Console.WriteLine("Now we are in Class1, using method which inherit from Interface ABC ");
11 }
12
13 public void N()
14 {
15 Console.WriteLine("Now we are in Class1, we used method which not inherit from Interface ABC ");
16 }
17}
18
现在再进行如下调用:
2t.M();
可以想到的结果自然是:Now we are in Class1, using method which inherit from Interface ABC
而如果调用改成:
2t2.M();
结果将会是:Now we are in Class1, But using method which not inherit from Interface ABC
显然,编译器非常明晰的分清了实现ABC的M()与Class1自己的M()。现在反过来想一想,我们怎么能要求用ABC声明的t去实现N()呢。