我知道继承普通类可以让子类用父类的方法,可以少些代码但是接口和抽象类 只是声明了方法名没有方法体,只用在实现类和继承的子类重写方法才行!!  那为什么不在子类中直接写这些方法呢   感觉现在还是弄不明白  像是多余的一样!!!所以求明白人帮帮忙 这个问题困扰了我很久很久了   求能顿悟

解决方案 »

  1.   

    对于接口的作用,在一些小的项目上,很难看出其发挥的优势。这就使一些经常的做小项目的开发人员,做时间久了就感觉不到它有什么好的,有时候写起来还麻烦,干脆不用了。其实,在一些大项目上,接口的作用是发挥地相当的明显的。比如:如果你开发业务逻辑代码,当你好不容易的实现了它全部的功能,突然用户需求要改,你在修改你代码的同时,调用你代码的其它人也会改,如果代码关联性强的话,会有很多人都要改动代码,这样一来二去,程序会变得相当的不稳定,而且可能还会出现更多的新Bug,所有人都可能会陷入混乱。
    但如果使用接口的话,在你使用它之前,就要想好它要实现的全部功能(接口实际上就是将功能的封装)。确定下这个接口后,如果用户需求变了,你只要重新写它的实现类,而其它人只会调用你的接口,他不管你是怎么实现的,它只需要接口提供的功能。这样,很可能只需要把你的代码修改就可以了,其他人什么都不用做。
    同时:这样做的话,使得开发人员能够分工明确,只要确定下来接口了,就可以同时进行开发,提高开发效率。
    另外,使用接口还有使用方便,可读性强,结构清晰等优点。当然,我说的这些也可能是浅层面的,在其他方面还有很多的好处。抽象类:可以有抽象方法,也可以有方法的实现。抽象类不一定有抽象方法,而有抽象方法的类一定是抽象类。抽象类不能实例化。
    接口:只有方法体的声明,没有方法实现。一个类可以实现多个接口,但只能继承一个抽象类。在项目上,我们一般的做法是:最上层为接口,中间层次为抽象类,往下就是我们的实现类。为什么我们会在中间加上抽象类呢,就是为了提高代码的可重用性,你可以在抽象类里提炼出一些公用的已经实现的方法,那么底下那些实现类只要继承它也就继承了这些方法。*****
    *****
    以上转载自百度.还是可以看一下的,你硬要问抽象类和接口有什么作用,真的很难泛泛的回答,具体可能还是要真正做项目的时候才好用,项目越庞大越复杂越能体会到接口的方便。楼主自己摸索吧。
      

  2.   

    大型项目中,往往是构架师或者高级软件开发人员负责进行整体架构设计的,这个时候,他们定义接口和抽象类,确定好整体的软件构架,然后中低层的软件研发人员再负责对接口进行实现,这是从分工的角度谈接口和抽象类的作用
    在软件设计模式里,几乎所有的模式都要用到接口或者抽象类,因为这是抽象软件架构的重要方法,也是OOP所提倡的编程理念,这是从软件工程的角度谈接口和抽象类的作用
      

  3.   

    现实点的例子
    public class 食物{}
    public class 主食 extends 食物{}
    public class 面食 extends 主食{}
    public class 米食 extends 主食{}
    public class 馒头 extends 面食{}
    public class 包子 extends 面食{}
    public class 狗不理包子 extends 包子{}
    public class 天津产的狗不理包子 extends 狗不理包子 {}
    public class 面条 extends 面食 {}
    public class 米饭 extends 米食 {}
    ……如果你只吃“面”食,那么你的灵活性没有吃“主食”的强
    如果你只吃“包子”,那么你的灵活性肯定比吃“面食的差
    如果你只吃”天津产的狗不理包子“,你的灵活性会更差
    ……
    具体一点说,如果你有一个方法,需要传入一个”食物“的参数,明显你在设计你的方法时,把参数类型设置为”泛类型“比传入”精确类型“更具灵活性:
    // 差的灵活性
    public class Person {
        public void f(天津的狗不理包子 food){
        }
    }// 好的灵活性
    public class Person {
        public void f(主食 food){
        }
    }对第二个类,调用者可供选择的参数有很多
    Person p = new Person();
    ......
    p.f(new 面条());
    p.f(new 米饭());
    f.f(new 包子());
    ……
    而对第一个类,调用者只能
    Person p = new Person();
    ……
    p.f(new 天津的狗不理包子());==============================================
    楼主转换一个观念,继承、抽象类、接口等等多态,带来的方便并不体现在对这些类的实现上,而是体现在使用这些类的灵活性上。
      

  4.   

    using System;
    using System.Collections.Generic;
    using System.Text; 
    namespace Example17
    {    
       class Program    
       {        
           //一个完整的接口声明示例        
             interface IExample        
            {            
              //属性            
                 string P{ get; set;}            
              //方法            
                 string F(int Value);            
               //事件            
                  event EventHandler E;            
               //索引指示器            
                  string this[int Index]{ get;  set; }        
              }        
               interface IA 
              { 
                int Count { get; set;}        
              }        
               interface IB        
              {            
                int Count();  
              }        
              //IC接口从IA和IB多重继承        
                 interface IC : IA, IB        
              {        
              }        
              class C : IC        
              {            
                 private int count = 100;
                 //显式声明实现IA接口中的Count属性            
                    int IA.Count            
                 {                
                     get { return 100; }                
                     set { count = value; }            
                  }            
                //显式声明实现IB接口中的Count方法            
                   int IB.Count()            
                {                
                   return count * count;            
                }        
          }        
          static void Main(string[] args)        
          {            
              C tmpObj = new C();             
              //调用时也要显式转换            
                Console.WriteLine("Count property: {0}",((IAtmpObj).Count);  
              Console.WriteLine("Count function: {0}", ((IB)tmpObj).Count());
              Console.ReadLine();        
           }    
       }
    }
      

  5.   

    嗯,你这个问题,最好是手把手的和你说比较好,几句文字可能你还不明白,说明加上例子你才能更好的理解,给你个链接,你看下他的视频,这是毕向东的视频,你下载第7天的,看完了,你就什么都懂了
    http://edu.csdn.net/main/feature/bxd_25.shtml