面向接口编程之惑 第二版

刚才对面向接口充满了疑惑 经过自己的仔细推敲 加上 Vs 的智能提示 终于找到解决方法了 放代码出来啊 如果你刚看过那篇 你应该很清楚了啊

 

 class Program
    
{
        
static void Main(string[] args)
        
{
            Computeruse com 
= new Computeruse();
            Adult me 
= new Adult();
            me.UseComputer(com);
            Child mybrother 
= new Child();
            mybrother.UseComputer(com);
            Console.ReadLine();
        }

    }

    
class Computeruse : IFinal
    
{
        
public Computeruse()
        
{
            Console.WriteLine(
"这个电脑我在用 别管我干嘛!!");
        }

        
IFinal 成员
    }

    
interface IFinal
    
{
        
void ToLearn();
        
void ToWork();
        
void ToFun();
    }

    
interface IComputerLearn:IFinal
    
{
        
void ToLearn();
    }

    
interface IComputerWork:IFinal
    
{
        
void ToWork();
    }

    
interface IComputerToFun:IFinal
    
{
        
void ToFun();
    }

    
class Adult
    
{
      
public void UseComputer(IFinal IFinal)
      
{
          IFinal.ToLearn();
          IFinal.ToFun();
      }

    }

      
class Child
      
{
          
public void UseComputer( IFinal IFinal)
          
{
              IFinal.ToFun();
          }

      }
这个应该是面向接口的最终版本了 希望下个项目会用到这个啊  呵呵~~

posted on 2008-07-20 10:40 Dr.Edison 阅读(131) 评论(8)  编辑 收藏

评论

#1楼  2008-07-20 13:36 Bēniaǒ      

你上面的设计有很大的问题.接口IFinal里有三个方法,IComputerLearn,IComputerWork,IComputerToFun这三个接口都同时继承IFinal接口,根据继承原理也就是这三个接口都同时具备了IFinal接口的三个方法了,那么你在这三个接口里分别定义一个接口方法起到什么作用呢???
此处你应该设计为,
interface IComputerLearn
{
void ToLearn();
}
interface IComputerWork
{
void ToWork();
}
interface IComputerToFun
{
void ToFun();
}
interface IFinal:IComputerLearn,IComputerWork,IComputerToFun
{
//这样,你的最终接口就拥有了这三个接口的方法
}   回复  引用  查看    

#2楼  2008-07-20 13:43 Bēniaǒ      

通过上面的修改,此时你的Computeruse了不用作任何修改,在Client端就需要作修改了,有继承关系就一定存在多态.那么你的Client就应该修改为:
IFinal fin = new Computeruse(); //多态
或许依赖于最高层次抽象
IComputerLearn learn = new Computeruse();
learn.ToLearn();
(IComputerWork )learn.ToWork();
(IComputerToFun )learn.ToFun();

注:这里的代码我没调试,你可以调试下,应该是不会有问题的.   回复  引用  查看    

#3楼  2008-07-20 15:35 DrEdison [未注册用户]

@Bēniaǒ
多谢赐教 只是 根据自己的编程感觉来写的程序 可能有些不妥之处   回复  引用    

#4楼  2008-07-20 19:38 Bēniaǒ      

@DrEdison
你只是没有搞清楚接口和继承的的关系而已.接口B继承于接口A,那接口B里就拥有接口A的所有方法了。
你可以看看我写的<<应用OOP的设计过程演化>>系列的几篇文章.
http://www.cnblogs.com/beniao/archive/2008/06/15/1222689.html   回复  引用  查看    

#5楼  2008-07-20 22:17 陈晨      

@Bēniaǒ
IFinal fin = new Computeruse(); //多态
或许依赖于最高层次抽象
IComputerLearn learn = new Computeruse();
learn.ToLearn();
(IComputerWork )learn.ToWork();
(IComputerToFun )learn.ToFun();
------------------------------------
IFinal 已经继承了IComputerWork 和 IComputerToFun
这里还有必要做类型转换吗?   回复  引用  查看    

#6楼  2008-07-20 23:44 Bēniaǒ      

@陈晨
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();

类型转换是必要的.





  回复  引用  查看    

#7楼  2008-07-22 22:01 陈晨      

@Bēniaǒ
--------------------------------------------------
明白了,IComputerLearn learn = new Computeruse();
learn 对象中没有ToWork和ToFun方法
所以要类型转换才可以   回复  引用  查看    

#8楼 [楼主] 2008-07-26 09:48 Dr.Edison      

@Bēniaǒ
这就是我们所说的接口分离啊,了解了!~   回复  引用  查看    


标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
博客园首页

新闻频道

社区

小组

博问

网摘

闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-07-20 10:47 编辑过
成果网帮您增加网站收入


相关链接:
 


公告

没事 走两步~

导航

<2008年7月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

统计

与我联系

搜索

 

常用链接

留言簿

我参加的小组

我的标签

随笔档案

最新评论

  • 1. re: To Terrylee
  • @TerryLee
    感谢Terry啊 百忙之中 能够看我的文章啊 希望有机会能跟你学习一下面对变化 现在在客户这里 可能回复比较慢不好意思啊
  • --DrEdison
  • 2. re: To Terrylee
  • Sorry,今天刚看到你的文章,有这样的疑问,说明你对此进行了思考,但是还没有掌握设计模式的精髓。从来没有谁说过,一定要为了优雅而使用设计模式,建议你看一下《从重构到模式》这本书,设计模式只是为了封装...
  • --TerryLee
  • 3. re: To Terrylee
  • @volnet(可以叫我大V)
    谢谢@volnet(可以叫我大V) 谢谢各位 关注 我以为我的博文 被封死了呢~~谢谢~
  • --Dr.Edison
  • 4. re: To Terrylee
  • 当然,没有变化,你把产品卖给客户,就跟客户一刀两断,那干嘛要设计模式啊,自讨苦吃嘛,优雅也是要费神的…… 但是要变化的时候问题就会不那么简单了,设计模式让修改变的轻松,老板高兴不高兴先放一边,首先您高...
  • --volnet(可以叫我大V)
  • 5. re: To Terrylee
  • 你知道你该怎样做。
  • --真见

阅读排行榜

评论排行榜