item 20 区分实现接口方法和覆写虚方法

      学了一年多的c#,看了不少书,但是由于实践机会不多,忘的比学的快。迷茫了好一阵,听工作室的前辈说写博客是个不错的巩固知识的方式,于是想试一试,最近正在读《Effective C#》,所以想从读书笔记开始。

  今天刚看到第20条,如何区分实现接口方法和覆写虚方法。

  乍看之下,实现接口方法和覆写虚方法非常相似,都是在本类型中为在其他类型中声明的方法提供本类型的实现。但实际上是有本质不同的,至少,接口中的方法默认情况下是非虚的,也就是说子类不能覆写在基类中实现的接口虚方法。

  例如:

  

Code

 

上例中,要想在MyDerivedClass中定义ShowMessage方法,必须添加一个new关键字,说明它是一个在子类中增加的同名方法,而不是覆写基类的方法,该方法隐藏了基类的ShowMessage。此例说明接口中的方法是非虚的,所以实现接口方法和覆写基类虚方法是不一样的。

  那么如果想要基类实现某接口,然后在子类中修改基类接口方法的实现,从而让客户端不能访问基类的方法实现,有两者选择:

     1.如果你不能访问基类,可以在子类中重新实现那个接口。

 

Code

这个时候,IShowMsg.Message()就会用子类的实现了

 

Code

 

但是这种方式并不能阻止客户端调用基类实现的接口方法

 

Code

 

   2.那么还有第二种方式,就是在基类中将实现的接口方法声明为virtual

 

Code

 

通过把接口方法声明为虚方法,就可以在任何子类中覆写接口方法,提供自己的实现,并且在调用接口方法时不管子类对象的声明类型是什么,

都会由于多态机制而调用子类的版本。即: 

Code

 

     如果你的目的只是想在子类中提供自己的版本的接口方法实现,那么可以在基类中像这样实现接口:

 

Code

通过在抽象基类中提供接口方法的抽象实现,你可以强制在你的任何非抽象子类中提供自己的接口方法的版本。

在这个条目的最后,作者给了个总结,我在这里引用一下:

实现接口方法比创建和覆写虚方法更加灵活,你可以在基类中创建接口方法的密封实现(sealed),虚实现(virtual),或抽象实现(abstract)

你可以显示的决定在什么情况下子类可以在子类中修改基类实现的接口方法的逻辑。

    第一次真正意义上的写技术博客,还有很多问题,请各位高手指点,拍砖轻一点。

posted @ 2009-09-09 23:49 PeterLau 阅读(158) 评论(2) 编辑 收藏