为什么非要去定义这些东西啊?与其继承了这些东西然后再去实现他们,为什么不直接去实现这些想要的方法呢?
小白求大家指教啊~~~~

解决方案 »

  1.   

    一个是为了约束,共同开发的时候用的多。
    你有时间看看设计模式,我现在的项目要用SSH,发现作用还是很大的。
      

  2.   

    额,工厂模式?据说有好多种是么0 0 看哪个啊那个SSH是啥啊。
      

  3.   

    这位大牛着实打击我个半死啊- -
    我只是觉着学了那么多语法的东西总要用的吧,可是不知道啥时候用为啥要用,所以想问问。
    我是在自己写个东西,以前没有写的从没用过接口啥的(别鄙视我啊,我觉着哪个小白刚起步也不会上来就把各种OOP技术都使上去吧),这次想写个像点样子的东西所以就想最起码用到这些吧,可是不知道什么地方用,为啥用0 0
    还求大牛稍微透露点。
      

  4.   

    接口可以理解为标准
    比如说 我们的插座 市面上所有的电器不是两孔就是三孔 不可能来个一孔或者四孔 这就是为了和插座兼容 这样子插座才可以给你供电 这里可以理解为外部针对接口的调用 但是具体这个电给你了你怎么用 那就是电器自身的事情 这里你就可以理解为实现了接口的类
    用代码表示就是
    public interface IChaKong//插孔接口
    {
      void Enpower()//给电
    }
    public class TV:IChaKong
    {
      public void Enpower()
      {
      //放电视的操作
      }
    }
    public class AirCondition:IChaKong
    {
      public void Enpower()
      {
      //空调制冷或者制冷的操作
      }
    }public class ChaZuo()//假设一个插座类(准确说应该是个接线板) 他包含三个插孔接口类型的变量
    {
      List<IChaKong> chaKongs=new List<IChaKong>();
      public void Enpower()//这个相当于是把插座接上电
      {
      foreach(var temp in chaKongs)
      {
      temp.Enpower()//接口的方法 对于插座而言不知道插在插孔上的电器具体是在干什么
      }
      }
    }public class Program
    {
      public static Main()
      {
      var chaZuo=new ChaZuo();
      chaZuo.chaKongs.Add(new TV())//相当于给插孔插上一个电视
      chaZuo.chaKongs.Add(new AirCondition())//相当于插了一个空调
      chaZuo.Enpower()//把接线板插到电源上
      }
    }不知道这样的解释能不能说明白 个人感觉接口的作用更多的是要到实际编程里面去体会的
      

  5.   

    楼上很多人说了半天一会儿让lz看这个,一会儿让lz领悟那个,估计lz晕了。其实没有那么高深,几句话就能说清楚。问lz几个问题
    (1)如果我写一个代码交给lz维护,你是愿意在我的代码中改来改去呢,还是直接再按照一定规则编写一段代码来扩展呢?
    (2)如果lz是一个框架库的编写者(这听上去有点高级),你的用户不再是最终用户,而是一些初级程序员,你如何让他们觉得你的框架库好用。比如你的框架库应该适应尽可能多的情况(这些情况你不能一一预料到并且写在代码中),同时还要避免他们修改你的代码(你的代码已经编译成dll了)。也许具体怎么做你不知道,但是看了我的两点,原则你已经知道了,那就是你编写的代码必须对功能的扩展开放(允许他们扩展功能),同时对修改关闭(程序本身不应该被修改,就像你不会随便修改System.Data,System.Web中的代码,实际上也没有代码给你修改)。这个原则很多程序员已经意识到了,于是简称为OCP(开放关闭原则)。那么接口、抽象类的作用是什么呢?它就是使得你的代码符合这个原则:我们看这么一个场景,我们编写的程序提供了日志输出的功能:foo()
    {
        ...
        try
        {
            ...
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
        ...
    }这个程序作为直接给最终用户编码的程序,显然没有什么问题。但是你可能意识到了,这个程序只能在控制台上才能显示错误,如果是在ASP.NET中,我们需要把输出的方式修改下才行。那么WinForms呢?我们还得修改。这对于一个通用的函数库来说,显得不可以接受。
    当然你可以做一个判断,并且把这三种形式都包括在内。可是真的只有三种么?如果调用你的程序员说,我想把错误输出到日志文件中,你不得不再增加第四种输出方式。如果用接口,就没有问题了。我们定义一个接口:
    ILogger
    {
        void WriteLine(string content);
    }这个接口表示,我们允许用户传递一个可以包含WriteLine方法的类,具体什么类不重要,只要它能有这个方法就可以了。我们的代码修改如下:
    foo(ILogger log)
    {
        ...
        try
        {
            ...
        }
        catch (Exception ex)
        {
            log.WriteLine(ex.Message);
        }
        ...
    }这样,我们的程序就把输出到哪里从程序中提取出来了,让调用者决定。如果调用者在编写一个控制台程序,他可以这么用:
    class ConsoleLog : ILogger
    {
        public void WriteLine(string content)
        {
            Console.WriteLine(content);
        }
    }
    ...
    foo(new ConsoleLog());如果调用者在写asp.net程序,它只需要定义另一个类就可以了
    class ResponseLog : ILogger
    {
        public void WriteLine(string content)
        {
            Response.WriteLine(content);
        }
    }
    ...
    foo(new ResponseLog());很明显没,如果他想输出到文件,或者显示在别的地方,都只需要自己定义一个类,实现这个接口,再传进去就能办到了。也就是不修改你的代码,在你的代码上扩充,实现无限的扩展。这就很好回答了最初的两个问题。
      

  6.   


    public class ChaZuo()  ???这是类无()
      

  7.   

    接口只是一种标准约束。比如说,我们使用的电脑,显示器可以购买不通厂商的,鼠标键盘也可以,包括内部配件硬盘,显卡等等,为什么呢?因为它们遵循了共同制定的接口。不管内部怎么做,与外界对接的接口是大家公共定义的,你只要遵循这个标准,就可以通用了。
    抽象类:抽象类比接口多了一些细则的东西,比如抽象类可以实现一些方法,定义一些属性。比如说,我们现在的手机CPU有单核,双核,四核的。基本上都是基于ARM架构的,那么你肯定问,手机的cpu是ARM出产的吗?不是,ARM只是做CPU架构,然后其它厂家购买这种架构生成基于这种架构的CPU,所以我们手机里面有三星的,高通的,但是架构都大同小异。所以对于生产厂家来说,ARM就是抽象类,而具体的生产厂家就是实现类表达能力不是很好,这个问题面试的时候经常问到。我是觉得以个人的理解讲解比搬标准的定义要好一些。
      

  8.   

    就像电脑的USB接口,可以插鼠标,插键盘,插手机,插MP3。
    而不是每个设备都弄一个接口,电脑也弄不出那么多洞。
    作用就是标准化,减少冗余代码。
      

  9.   

    我出道的时候也盲目,知道有这些玩意,不知道往哪用。进了公司后,接触到实际项目,又理解了一些,但是发现自己往往盲目使用。编程:只是功能实现而已,没啥技术含量。google、baidu。ctrl+c\ctrl+v设计:才是进阶的目标。我的建议是有个项目接触,然后看看设计模式。很快你就有才了
      

  10.   

    哥们,下面是我总结的,不知道对不对,不对的请大家指正,谢谢抽象类:
    含义:                             声明方法的存在而不去实现它的类被叫做抽象类(abstract class)
    方法名修饰符:                 abstract
    实例化:                          不能创建抽象类的实例
    实现:                             可以有选择性地实现需要用到的方法(即重写)
    是否能包含已实现的方法:  可以,即不一定要求所有方法都是抽象的
    继承:                             单
     
     
     
    接口:
    含义:                             抽象类的变体 
    方法名修饰符:                 abstract
    实例化:                          不能创建接口的实例
    实现:                             必须实现所有的方法(即重写)
    是否能包含已实现的方法: 不可以,即一定要求所有方法都是抽象的
    继承:                         单
      

  11.   

    哥们,这是我以前总结的,不知道是否完全正确,不正确的地方,请大家指正,谢谢。抽象类:
    含义:                             声明方法的存在而不去实现它的类被叫做抽象类(abstract class)
    方法名修饰符:                 abstract
    实例化:                          不能创建抽象类的实例
    实现:                             可以有选择性地实现需要用到的方法(即重写)
    是否能包含已实现的方法:  可以,即不一定要求所有方法都是抽象的
    继承:                             单
     
     
     
    接口:
    含义:                             抽象类的变体 
    方法名修饰符:                 abstract
    实例化:                          不能创建接口的实例
    实现:                             必须实现所有的方法(即重写)
    是否能包含已实现的方法: 不可以,即一定要求所有方法都是抽象的
    继承:                         多
      

  12.   

    我认为每个编程的人或多或少都玩游戏吧,我举个简单例子。
    大多数游戏都有多种职业,那么你需要定义一个职业的interface,这个interface中有一个方法attack。
    那么你的程序在执行的时候,对于所有职业来说都有attack这个方法,是不是简单多了?如果你是每个类都去单独实现的话,那么你必须将每个职业都设置一个attack的方法,这样你的程序才好写,也许我说明不是很好,但是大致意思就是所有职业因为继承了职业的interface,那么他们都有一个统一的attack方法,也就是标准。
    抽象类的话,跟interface差的不是很多,抽象类的子类必须实现抽象类中的抽象成员,否则编译不通过。
    这样说,如果你写了一个类,其中有一个方法fun。你知道了你写的类将会被别人拿去继承,但是你又担心别人写的子类中不会去实现fun方法,也fun方法将在你的程序中是一个不可缺少的方法,那么你只需要将fun设置为抽象的就可以了,那么别人继承你的类的时候,fun方法必须实现了,那么你的主程序中调用fun的时候就不会出现调用了null方法的问题。
      

  13.   

    谢谢各位的指导啊,因为小弟刚刚开始接触C#没多久,只是一直在看什么C#入门经典,C#高级编程之类的。对语言性东西知道个一知半解的了,但却不知道在实际中如何去运用看来还得多动手然后看看设计模式之类的东西- -对了,借这个帖子还想再问点东西希望哪位大牛不吝赐教啊。
    我对多态理解的也是很糊涂,之前看JAVA编程思想开头就在讲面向对象思想,里面说的多态我感觉很神奇,可在有的书里说方法的重载就是多态?
    我的理解那是不是泛型和变量数组也是多态的一种体现啊?
      

  14.   

    额,这个。。
    让我想起了JAVA思想里说的那个鸟例子,
    小弟愚笨在代码里怎么体现多态呢
      

  15.   


    代码里面体现。难道要我贴代码?这样吧,我把上面的例子发散一下:
    动物换成狗,狗有一个方法fun,那么狗生下的两只狗A和B也都有方法fun,如果主人对两只狗拍手,也即调用fun方法。
    狗仔A会摇尾巴,狗仔B会咬主人一口。大致就这样了。
      

  16.   

    这么多人一个好一点,形象一点的合理的解释都没有!!!
    楼主,接口,这个 概念其实是为了标准,
    不知道你做过网页没有……像<html>,<a></a>这样的标签,每个浏览器都要支持它,你要问为什么要支持它,因为好多程序员都要调用它!!很多程序员都被灌输这样的概念,比如说看到<a href='www.baidu.com'>百度</a> 就知道这是一个链接到百度的超链!!还比如说:JS函数  document.getElementById("myid");这句话;浏览器的制造厂商要让程序员调用它的时候会产生“得到ID为‘myid’的标签的值”的这种效果!!具体它是怎么实现的,我们不知道!!我们调用的时候,只管它产生的后果!!!那些浏览器厂商,像微软,谷歌,苹果,还有像什么搜狗,腾讯的都要让“程序员”在调用这些“接口”的同时都要产生一致的效果!!!这就是接口的作用!!!
    其实吧!!像C#  的语吧吧!!你为啥要这样子写呢!!因为这是个标准!!你要是写错了,编译器就不认识你!!可能你一直用一些像VS,esclipse这样的智能工具,所以你就漠视了这些概念!!
    说白了!!接口是啥,接口就是:能让别人调用,并会产生一致性效果的东西!!!像C#,Java里的那些关键字,系统函数啥的都可以称为“接口”!!接口只是为了一致性的东西!!!你不要认为它很神性!!它就是抽象出的一种概念而己!!!
      

  17.   

    http://book.360buy.com/10064461.html推荐你看看这本书。你会有所理解!