我的代码夹
刚才对面向接口充满了疑惑 经过自己的仔细推敲 加上 Vs 的智能提示 终于找到解决方法了 放代码出来啊 如果你刚看过那篇 你应该很清楚了啊
posted on 2008-07-20 10:40 Dr.Edison 阅读(131) 评论(8) 编辑 收藏
你上面的设计有很大的问题.接口IFinal里有三个方法,IComputerLearn,IComputerWork,IComputerToFun这三个接口都同时继承IFinal接口,根据继承原理也就是这三个接口都同时具备了IFinal接口的三个方法了,那么你在这三个接口里分别定义一个接口方法起到什么作用呢??? 此处你应该设计为, interface IComputerLearn { void ToLearn(); } interface IComputerWork { void ToWork(); } interface IComputerToFun { void ToFun(); } interface IFinal:IComputerLearn,IComputerWork,IComputerToFun { //这样,你的最终接口就拥有了这三个接口的方法 } 回复 引用 查看
通过上面的修改,此时你的Computeruse了不用作任何修改,在Client端就需要作修改了,有继承关系就一定存在多态.那么你的Client就应该修改为: IFinal fin = new Computeruse(); //多态 或许依赖于最高层次抽象 IComputerLearn learn = new Computeruse(); learn.ToLearn(); (IComputerWork )learn.ToWork(); (IComputerToFun )learn.ToFun(); 注:这里的代码我没调试,你可以调试下,应该是不会有问题的. 回复 引用 查看
@Bēniaǒ多谢赐教 只是 根据自己的编程感觉来写的程序 可能有些不妥之处 回复 引用
@DrEdison 你只是没有搞清楚接口和继承的的关系而已.接口B继承于接口A,那接口B里就拥有接口A的所有方法了。 你可以看看我写的<<应用OOP的设计过程演化>>系列的几篇文章. http://www.cnblogs.com/beniao/archive/2008/06/15/1222689.html 回复 引用 查看
@Bēniaǒ IFinal fin = new Computeruse(); //多态 或许依赖于最高层次抽象 IComputerLearn learn = new Computeruse(); learn.ToLearn(); (IComputerWork )learn.ToWork(); (IComputerToFun )learn.ToFun(); ------------------------------------ IFinal 已经继承了IComputerWork 和 IComputerToFun 这里还有必要做类型转换吗? 回复 引用 查看
@陈晨 Computeruse类作为他门最终的实现类. IComputerLearn ,IComputerWork, IComputerToFun为最高层接口 IFinal //中层接口,拥有上面三个父接口的所有方法 Computeruse //最终实现类 当你在使用多态特性的时候如下调用: IComputerLearn learn = new Computeruse(); learn.ToLearn(); //OK,这里没问题. IComputerLearn 接口里只定义有ToLearn()方法,Computeruse类里虽然有ToWork()和ToFun()方法的定义,如果此时你要去调用ToWork()或是ToFun()方法可以吗???? 所以: (IComputerWork )learn.ToWork(); (IComputerToFun )learn.ToFun(); 类型转换是必要的. 回复 引用 查看
@Bēniaǒ -------------------------------------------------- 明白了,IComputerLearn learn = new Computeruse(); learn 对象中没有ToWork和ToFun方法 所以要类型转换才可以 回复 引用 查看
@Bēniaǒ这就是我们所说的接口分离啊,了解了!~ 回复 引用 查看