一、abstract

abstract 的词义是“抽象”,它用来定义抽象类。抽象类不能被实例化只能被继承。

定义抽象类的格式如下:public abstract ClassName{……}

注意:只有基类成员声明为virtual或abstract时,才能被子类重写;而如果子类想改变虚方法的实现行为,则必须使用override关键字。

二、接口

出现缘由:由于c#语言不支持类的多重继承即一个类在定义时最多只能声明一个父类,因此,如果某个类需要继承多方面的行为时,抽象类或父类就不能满足条件了。故诞生了接口,一个类在定义时可以继承或者说实现多个接口。

相关细节:

》接口像类一样声明,是引用类型 ; 接口里面的成员可以包含方法的签名(方法签名指方法名、形参类型,以及形参的数量和排列顺序)、属性、事件和委托,但在接口中不可以定义数据成员(字段)和静态成员。与类不同的是,接口中的方法仅仅是他们的声明,并不提供实现。因此可以这样说:接口是函数声明的集合,封装了一些类共有的行为(方法)。如果类或结构从一个接口派生,则这个类或结构负责实现该接口中所声明的所有成员。一个接口可以从多个接口继承,一个类或结构可以实现多个接口。实现接口,就是在类中依次把接口中的方法全部写完整,即每个都补上方法体(花括号及里面的代码部分)。实现接口的类可以把它当做接口的子类,而接口可以认为是他们的父类。

》接口声明格式: 【属性】【修饰符】interface 以大写字母I开头的接口名 【:基接口】

》接口中每个成员的声明后必须加分号,不能包含任何实现;属性{ }后不用加。

》接口内的成员声明不能包含任何修饰符,所有接口成员的访问方式自动是public;

》在声明一个类来实现一个接口时,如果该类还要显示声明基类(即继承自某个父类),则基类和接口之间要有逗号分开,且基类写在前面。区别在于,一个类只能从一个基类派生,但可以实现多个接口。

》接口的继承:定义完接口后,如果有类想继承该接口,则它必须实现接口中定义的所有方法。派生接口继承了基接口中的函数成员说明。接口允许多重继承,一个派生接口可以没有基接口,也可以有多个基接口。在接口声明的冒号后列出被继承的接口名字,多个接口名之间用逗号分隔。

》如果基类实现了某个接口,则其接口成员就不能在该基类的派生类中实现了。基类也可以在接口成员上添加virtual关键字,这时,派生类就可以通过重写来实现这些接口成员。可以参照基类的重写.

》若类要实现某个接口,则必须实现该接口里的所有接口成员;

》如果一个类实现了多个接口,并且有些接口里的成员的签名和返回类型相同,那么,在类中只需要实现一个就能满足所有相同的了。

》接口和as运算符:如果我们尝试将类对象引用强制转换为类未实现的接口的引用,则会抛出一个异常,那么as运算符就是为了避免这个问题(即使转换不了也不会抛出异常而是返回null)。

格式:接口名 变量名=类对象名 as 接口名;这时,如果类实现了接口,表达式返回指向接口的引用,若未实现,表达式返回null而不是抛出异常;

》实现接口有两种方式,隐式和显示。采用隐式接口实现时,类或接口都可以访问接口中的方法;而若采用显示接口实现方式,实现接口的类中的接口方法不能使用任何访问修饰符,都默认为私有。接口方法只能通过接口来完成访问,都不能通过类的对象访问,正确的访问方式是把类对象再显式地转换为对应的接口,通过接口对象来调用方法 。如:IPerson  per=(IPerson) USAPerson; per.Speak();

》当类实现单个接口时,通常使用隐式接口实现方式,这样类的对象可以直接去访问接口方法。

》当类实现多个接口且不同接口中有相同方法签名和返回类型的方法时,则使用显示接口实现方式。即使没有相同的方法啊签名,在实现多个接口时,仍推荐使用显示接口实现方式,因为这样可以标识出哪个方法属于哪个接口。

》接口在类中实现后,调用接口中实现了的方法有两种:

一是创建该类的对象,用 对象名.接口成员即可,就像用对象调用自己类中的方法一样;

二是先把类对象引用强制转换为接口类型来获取指向接口的引用,再用点运算符调用接口的方法。从类对象引用获取接口引用的格式: 接口名 变量名=(接口名)类对象名;如 IAnimal  animal = (IAnimal) myDog ;

然后就可以用 变量名.方法名  来调用接口里的方法,如 animal.Eating();

》派生类的基类中,若有与其接口相同的方法等的实现,则在派生类中不必再次重申。

》显式接口实现:即在实现接口的类中,通过在方法名等前加接口名和点。它是为了希望每个接口分离实现,并且只可以通过指向接口的引用来访问;

三:抽象类和接口的区别,何时用抽象类何时用接口

关于这个方面,自己还没有清楚地认识,因为自己用的少,见得少,以后再补充。这里有一篇相关的博客应该可以对其有个大概的认识:http://www.cnblogs.com/huihui-gohay/archive/2009/12/13/1623070.html

这篇文章的重点如下:

1、解释了“面向对象编程”和“面向接口编程”两个词的大致关系:面向接口编程是面向对象编程的思想精髓之一。还解释了面向对象:面向对象思想的核心之一,就是模拟真实世界,把真实世界中的事物抽象成类,整个程序靠各个类的实例互相通信、互相协作完成系统功能,这非常符合真实世界的运行状况,也是面向对象思想的精髓。

2、接口的作用:接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有的一组规则。体现了自然界“如果你是……则必须能……”的理念。

3、面向接口编程实践:大致表达比如定义一个属性或字段的类型,一个方法的参数类型,如果可以用接口或抽象类代替具体类,那就用接口或抽象类。

4、对二者如何选用:“如果单从具体代码来看,对这两个概念很容易模糊,甚至觉得接口就是多余的,因为单从具体功能来看,除多重继承外(C#,Java中),抽象类似乎完全能取代接口。但是,难道接口的存在是为了实现多重继承?当然不是。我认为,抽象类和接口的区别在于使用动机。使用抽象类是为了代码的复用,而使用接口的动机是为了实现多态性。所以,如果你在为某个地方该使用接口还是抽象类而犹豫不决时,那么可以想想你的动机是什么。”

5、另一点区别:“再者,我认为接口和抽象类的另一个区别在于,抽象类和它的子类之间应该是一般和特殊的关系,而接口仅仅是它的子类应该实现的一组规则。”

最近对这两个东西挺迷惑,在了解设计模式相关知识时,参考的两本书中,有在讲同一个模式时,一个类图用的抽象类,一个用的接口,故懵逼了。以后有时间有心情再看看c#相关基础知识,再来继续完善补充。

c#基础之abstract和interface的更多相关文章

  1. abstract与interface之房祖名张默版

    最近把java基础知识拿出来看看,看到abstract与interface的时候,觉得有点模糊,好像面试官也喜欢问这个问题.我在百度了查了好长时间,觉得讲算比较清楚的是那篇讲 Door,然后想要带个报 ...

  2. Java基础-面向接口(interface)编程

    Java基础-面向接口(interface)编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的“类 ...

  3. 转:Java中abstract和interface的区别

    转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...

  4. Java开发之abstract 和 interface的区别

    Java开发abstract 和 interface的区别 java开发里面经常会用到虚函数和接口,这两者的区别是什么呢? abstract: 子类里面只能继承一个父类 interface: 子类可以 ...

  5. AbStract 和Interface 方法是否能用Static修饰,为什么?

    Abstract 和Interface 方法是否能用Static修饰,为什么? interface中不能含有Static方法,属性,成员变量. Abstract中可以有Static方法,属性,成员变量 ...

  6. [ 原创 ] Java基础5--abstract class和interface的区别

    1.含有abstract抽象修饰符的类就是抽象类.abstract 类不能创建实例对象 2.含有abstract方法的类必须定义为abstract class,abstract class类中的方法不 ...

  7. PHP namespace、abstract、interface、trait使用介绍

    小菜鸟一枚,一直搞不懂 namespace.abstract.interface.trait 这些关系,就抽出几天时间研究,做个总结,不足之处希望大家指正交流. namespace 命名空间 介绍:顾 ...

  8. C#基础--AbStract与Interface

         Interface: 接口方法不能用public abstract等修饰.接口内不能有字段变量,构造函数. 接口内可以定义属性,如string color{get;set;}这种. 实现接口 ...

  9. 面向对象、类与对象、成员与局部变量、封装、private、构造函数、this、static、extends、super、final、abstract、interface、多态、内部类、异常【5】

    若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing ...

随机推荐

  1. angular.js使用ui-router注入报错,这里是版本问题导致的

    报错如下: common.ts:604Uncaught SyntaxError: Unexpected token ) stateEvents.ts:211Uncaught SyntaxError: ...

  2. 10_常见的get和post请求_路由器_ejs服务器渲染模板引擎

    1. 常见的 get 和 post 请求有哪些? 常见的发送 get 请求方式: 在浏览器地址栏输入 url 地址访问 所有的标签默认发送的是 get 请求:如 script link img a f ...

  3. HDFS的WEB页面访问常见问题

    HDFS的WEB UI管理页面 50070 端口 无法访问解决办法! 本文基于HADOOP-3..1.0,Cecntos7.0环境下进行测试,所以遇到很多新鲜的问题: 特别注意:HaDoop3.0之前 ...

  4. Linux_相关命令(学习,备忘)

    1.Linux 查看实时cpu使用率: top 说明:top命令即时显示process的动态 2.查看cpu处理器使用率: cat /proc/stat 3.平均cpu使用率 4.赋予文件夹下所有文件 ...

  5. Gym 101606B - Breaking Biscuits - [凸包+旋转卡壳][凸包的宽度]

    题目链接:https://codeforces.com/gym/101606/problem/B 题解: 对于给出的 $n$ 个点,先求这些点的凸包,然后用旋转卡壳求出凸包的宽度(Width (min ...

  6. 14 - How to check replication status

    The people using PostgreSQL and the Streaming Replication feature seem to ask many of the same quest ...

  7. Express全系列教程之(五):Express的中间件

    一.中间件 从字面意思,我们可以了解到它大概就是做中间代理操作,事实也是如此:大多数情况下,中间件就是在做接收到请求和发送响应中间的一系列操作.事实上,express是一个路由和中间件的web框架,E ...

  8. Elasticsearch学习笔记(十四)relevance score相关性评分的计算(1)

    一.多shard场景下relevance score不准确问题     1.问题描述:            多个shard下,如果每个shard包含指定搜索条件的document数量不均匀的情况下, ...

  9. css相关整理-其他

    1.设备像素(device pixel): 设备像素是物理概念,指的是设备中使用的物理像素.CSS像素(css pixel): CSS像素是Web编程的概念,指的是CSS样式代码中使用的逻辑像素.通过 ...

  10. Python 多线程和线程池

    一,前言 进程:是程序,资源集合,进程控制块组成,是最小的资源单位 特点:就对Python而言,可以实现真正的并行效果 缺点:进程切换很容易消耗cpu资源,进程之间的通信相对线程来说比较麻烦 线程:是 ...