首页 > 其他 > 详细

接口和抽象类的联系与区别

时间:2014-04-28 20:29:39      阅读:393      评论:0      收藏:0      [点我收藏+]
1.抽象类是“定义”(例如什么是人),接口是规范类(人的种类,如黑人白人)。即抽象类是通过分析实体类的联系得到的,而接口则是规范,实体类必须来实现这个接口的方法。
2.接口定义的方法都是抽象的,而抽象类可定义非抽象方法。
3.抽象类使用的是extends,而接口使用的是implements,在高级语言如java中一般是不允许使用多重继承的。所以只能继续一个抽象类,却可以实现多个接口。
4.abstract class和interface所反映出的设计理念不同。(abstract class表示的是"is-a"关系,interface表示的是"like-a"关系)
假设为了描述动物的吃的行为,我们可以定义抽象类也可以定义接口,如下:
public abstract class Animal{
    abstract void eat(){...};
}
public interface Animal{
    void eat();
}
如果这时候想加一个飞行的行为,实现可能如下:
public abstract class Animal{
     abstract void eat(){...};
      abstract void fly(){...};
}
public interface Animal{
     void eat();
      void fly();
}
这样设计的话会出现一些问题:
如果有一些动物的实体类中不支持飞行的方法,但却已经具有飞行的方法了。
违背了Interface Segregation Principle(使用多个专门的接口比使用单一的总接口要好)。
这时候只能通过用抽象类+接口和接口+接口的方式类解决以上的问题:
public abstract class Animal{
     public abstract void eat(){...};
}
public interface AnimalFly(){
     void Fly();
}
这时实体类可以先继承Animal的抽象类再实现AnimalFly()的方法,也可以:
public interface Animal{
    void eat(){...};
}
public interface AnimalFly(){
     void Fly();
}
这样实体类只要直接实现两个接口便可
csdn某大神的例子(略有修改),即接口定义的都是abstract方法,所以动物抽象类则可定义非抽象方法:
namespace my
{
  interface 行为
  {
    void 吃();
    void 睡();
  }
  abstract class 动物 : 行为
  {
     public abstract void 吃();
     
     public virtual void 睡()
     {
       Console.WriteLine("我们的动物是会睡的,不是玩具!");
     }
  }
  class 猴子 :  动物
  {
      public override void 吃()
      {
          Console.WriteLine("我是一只猴子所以要在树上吃!");
      }
    
     public void 跳()
     {
       Console.WriteLine("我是一只猴子所以要跳来跳去的!");
     }
   }
  class myClass
  {
     public static void Main()
     {
       //动物 a = new 动物();
       //您见过一个动物这种品种吗?
       猴子 b = new 猴子();
       b. 睡();
       b. 吃();
       b. 跳();
     } 
  }
}
以上大部分总结自互联网,有错之处,还望指出

接口和抽象类的联系与区别,布布扣,bubuko.com

接口和抽象类的联系与区别

原文:http://www.cnblogs.com/hopb/p/3693098.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!