接口与抽象类的相同点:

1、不能实例化;

2、包含未实现的方法声明;

3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);

接口与抽象类的区别:

  1. 类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口只是一个行为的规范或规定

  2. 接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;

  3. 一个类一次可以实现若干个接口,但是只能扩展一个父类

  4. 接口可以用于支持回调,而继承并不具备这个特点.

  5. 抽象类不能被密封。

  6. 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的.

  7. .(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上。

  8. 抽象类实现了oop中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的座位子类去实现。

  9. 好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。

  10. 如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法.

 

什么时候使用抽象类和接口

1. 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。

2.如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口。

3.如果要设计大的功能单元,则使用抽象类.如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。

4.抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。

C#接口和抽象类Animal示例

下面的实例,本示例没有阐述抽象类和接口在设计模式中的应用,因为那将是另一篇有讨论价值的文本,本文着眼与概念和原则的把握,但是真正的应用来自于具体的需求规范。

设计结构如图所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{//定义抽象类public abstract class  Animal
{protected string _name;//声明抽象属性public abstract string Name
{get;
}//声明抽象方法public abstract void show();//实现一般方法public void MakeVoice()
{Console.WriteLine("all animals can make voice!");
}
}//定义接口public interface IAction
{void Move();
}//实现抽象类和接口public class Duck:Animal ,IAction
{public Duck(String name)
{
_name =name;
}//重载抽象方法public override void show()
{Console.WriteLine (_name+ " is showing for you.");
}//重载抽象属性public override string Name
{get { return _name;}
}//实现接口public void Move()
{Console.WriteLine ("Duck also can swim.");
}
}public class Dog : Animal, IAction
{public Dog(String name)
{
_name = name;
}//重载抽象方法public override void show()
{Console.WriteLine(_name + " is showing for you.");
}//重载抽象属性public override string Name
{get { return _name; }
}//实现接口public void Move()
{Console.WriteLine(_name +" also can swim.");
}
}//客户端实现public class TestAnimal
{static void Main()
{//声明抽象类Animal duck = new Duck("Duck");
duck.MakeVoice();
duck.show();Animal dog = new Dog("Dog");
dog.MakeVoice();
dog.show();//声明接口IAction dogAction = new Dog("A big dog");
dogAction.Move();Console.ReadLine();
}
}
}

结果:

参考:

http://blog.csdn.net/lwk2011/article/details/5974383 
http://www.cnblogs.com/mytechblog/articles/1906940.html 
http://blog.csdn.net/cjr15233661143/article/details/8592527

转载于:https://blog.51cto.com/57388/1652420

22. C# -- 抽象类和接口相关推荐

  1. 抽象类和接口类的区别

    2019独角兽企业重金招聘Python工程师标准>>> 一. 抽象类abstract class 1 .抽象类是指在 class 前加了 abstract 关键字且存在抽象方法(在类 ...

  2. 【JAVA基础篇】抽象类和接口的区别

    抽象类和接口是定义抽象概念的两种方式,正是由于抽象类和接口,才赋予了Java强大的面向对象的能力.在讨论他们的不同点之前,我们先来了解抽象类和接口. 抽象类 在面向对象的领域一切事物都是对象.对象都是 ...

  3. 为什么派生的子类报错不能实例化抽象类_一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别...

    目录 #抽象类介绍 #为什么要用抽象类 #一个抽象类小故事 #一个抽象类小游戏 #接口介绍 #接口与类相似点: #接口与类的区别: #接口特性 #抽象类和接口的区别 #接口的使用: #接口最佳实践:设 ...

  4. 《JAVASE系列》抽象类与接口

    <JAVASE系列>抽象类与接口 文章目录 <JAVASE系列>抽象类与接口 前言 1.抽象类 1.1抽象类是什么? 1.2 抽象的语法与细节 1.3抽象类的意义与作用 2.接 ...

  5. 夯实Java基础系列6:一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  6. 不允许使用抽象类类型的对象怎么办_Java基础——面试官:你来说说抽象类和接口的区别...

    无论你是新手Java 程序员,还是老手程序员,可能在实际开发中很少自己写抽象类. 但是抽象类在某些时候的功能很强大,可以保证子类中百分百实现父类中的方法 -- 普通类的弊端,消除子类的冗余代码 -- ...

  7. php 抽象类 接口 区别,PHP中抽象类、接口的区别与选择分析

    本文实例分析了PHP中抽象类.接口的区别与选择.分享给大家供大家参考,具体如下: 区别: 1.对接口的使用是通过关键字implements.对抽象类的使用是通过关键字extends.当然接口也可以通过 ...

  8. C#中抽象类和接口的区别

    一.抽象类:       抽象类是特殊的类,只是不能被实例化:除此以外,具有类的其他特性:重要的是抽象类可以包括抽象方法,这是普通类所不能的.抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆 ...

  9. java中抽象接口_一篇文章让你彻底理解java中抽象类和接口

    相信大家都有这种感觉:抽象类与接口这两者有太多相似的地方,又有太多不同的地方.往往这二者可以让初学者摸不着头脑,无论是在实际编程的时候,还是在面试的时候,抽象类与接口都显得格外重要!希望看完这篇博客文 ...

最新文章

  1. 006-1MOS管工作原理精讲
  2. devc++调试下一步没反应_某化工厂污水处理站SBR工艺调试方案
  3. BZOJ-1008 越狱
  4. 【Linux部署】Linux环境 .rar 格式文件处理工具安装使用(一波两折避坑指北)
  5. 3G与4G到底有何区别?
  6. 解决vuex中store保存数据,刷新页面会清空得问题
  7. jmeter5.1.1启动提示not able to find java executable or version的解决办法
  8. myeclipse9 maven web 环境
  9. [Oracle][ODBC SQL Server Driver][SQL Server]对象名 'RECOVER.HS_TRANSACTION_LOG' 无效(转)
  10. Java面试宝典2013版(11版块1000题)
  11. C++socket编程(七):7.4 正则表达式分析用户请求
  12. SparkMapReduce的区别、多线程多进程的区别
  13. 连续数字及数字串识别技术
  14. JS随机打乱数组的方法小结
  15. pve万兆网卡驱动_WiFi 6扩展有什么选择?Killer AX1650X无线网卡深度测评
  16. 拓嘉启远:拼多多店铺子账号设置,提高店铺效率
  17. 电脑端微信dat文件怎么打开
  18. 【联邦学习实战】基于同态加密和差分隐私混合加密机制的FedAvg
  19. [附源码]计算机毕业设计JAVA网上学车预约系统
  20. Scratch少儿编程案例-植物大战僵尸完整版

热门文章

  1. NFS网络文件系统服务配置、验证及错误解决
  2. HTML:调用静态页面html 的几种方法
  3. 基于Hadoop 2.6.0运行数字排序的计算
  4. php命令行(cli)下相对路径的问题
  5. VS2012程序打包部署详解
  6. Lync Server 2010企业版系列PART5:生成拓扑
  7. Windows 7关闭和开启系统休眠
  8. redis zset usage
  9. 教师节|祝所有可爱的讲师节日快乐!
  10. ObjectOutputStream 和 ObjectInputStream类的简单介绍,及运用。