博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
接口和抽象类的联系与区别
阅读量:5242 次
发布时间:2019-06-14

本文共 1541 字,大约阅读时间需要 5 分钟。

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. 跳();
     } 
  }
}
以上大部分总结自互联网,有错之处,还望指出

转载于:https://www.cnblogs.com/hopb/p/3693098.html

你可能感兴趣的文章
训练记录
查看>>
IList和DataSet性能差别 转自 http://blog.csdn.net/ilovemsdn/article/details/2954335
查看>>
Hive教程(1)
查看>>
第16周总结
查看>>
C#编程时应注意的性能处理
查看>>
Fragment
查看>>
比较安全的获取站点更目录
查看>>
苹果开发者账号那些事儿(二)
查看>>
使用C#交互快速生成代码!
查看>>
UVA11374 Airport Express
查看>>
P1373 小a和uim之大逃离 四维dp,维护差值
查看>>
NOIP2015 运输计划 树上差分+树剖
查看>>
P3950 部落冲突 树链剖分
查看>>
读书汇总贴
查看>>
微信小程序 movable-view组件应用:可拖动悬浮框_返回首页
查看>>
MPT树详解
查看>>
空间分析开源库GEOS
查看>>
RQNOJ八月赛
查看>>
前端各种mate积累
查看>>
jQuery 1.7 发布了
查看>>