c#基础之abstract和interface
一、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的更多相关文章
- abstract与interface之房祖名张默版
最近把java基础知识拿出来看看,看到abstract与interface的时候,觉得有点模糊,好像面试官也喜欢问这个问题.我在百度了查了好长时间,觉得讲算比较清楚的是那篇讲 Door,然后想要带个报 ...
- Java基础-面向接口(interface)编程
Java基础-面向接口(interface)编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.接口的概念 接口是功能的集合,同样可看做是一种数据类型,是比抽象类更为抽象的“类 ...
- 转:Java中abstract和interface的区别
转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...
- Java开发之abstract 和 interface的区别
Java开发abstract 和 interface的区别 java开发里面经常会用到虚函数和接口,这两者的区别是什么呢? abstract: 子类里面只能继承一个父类 interface: 子类可以 ...
- AbStract 和Interface 方法是否能用Static修饰,为什么?
Abstract 和Interface 方法是否能用Static修饰,为什么? interface中不能含有Static方法,属性,成员变量. Abstract中可以有Static方法,属性,成员变量 ...
- [ 原创 ] Java基础5--abstract class和interface的区别
1.含有abstract抽象修饰符的类就是抽象类.abstract 类不能创建实例对象 2.含有abstract方法的类必须定义为abstract class,abstract class类中的方法不 ...
- PHP namespace、abstract、interface、trait使用介绍
小菜鸟一枚,一直搞不懂 namespace.abstract.interface.trait 这些关系,就抽出几天时间研究,做个总结,不足之处希望大家指正交流. namespace 命名空间 介绍:顾 ...
- C#基础--AbStract与Interface
Interface: 接口方法不能用public abstract等修饰.接口内不能有字段变量,构造函数. 接口内可以定义属性,如string color{get;set;}这种. 实现接口 ...
- 面向对象、类与对象、成员与局部变量、封装、private、构造函数、this、static、extends、super、final、abstract、interface、多态、内部类、异常【5】
若有不正之处,请多多谅解并欢迎批评指正,不甚感激. 请尊重作者劳动成果: 本文原创作者:pipi-changing本文原创出处:http://www.cnblogs.com/pipi-changing ...
随机推荐
- sqlite3使用总结(转并且修改)
此文来自http://blog.csdn.net/shengfang666/article/details/7937200,我在这儿重新发一下,备份参考. 前序:一. 版本二. ...
- Tornado-Ajax
介绍 AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML).AJAX 不是新的编程语言,而是一种使用现有标准的新方法.AJAX是在不 ...
- 阿里云服务器Linux CentOS安装配置(11)安装Wordpress
下载wordpress安装包 wget https://cn.wordpress.org/wordpress-4.8.1-zh_CN.zip unzip wordpress-4.8.1-zh_CN.z ...
- js 中数组的遍历
var x = ['a','b','c'] x.forEach(function(val,k){ console.log(val + '--' +k); }) a--0 b-- 1 c-- 2 var ...
- js的一些注意点
18-12-24 oninput事件: 在用户输入时触发,它是在元素值发生变化时立即触发: 该事件在 <input> 或 <textarea> 元素的值发生改变时触发. 缺陷: ...
- callback function(回调函数) - 术语
回调函数(CallBack Function)的定义: [todo] 下面是callback的一个场景,linux内核.LwIP里也有使用callback funcs.
- Acrobat Pro DC 2019 mac中文版(pdf编辑器)
为大家准备了最新版本的Adobe Acrobat Pro DC 2019 for Mac,这是Adobe官方推出的pdf编辑器,acrobat pro dc 2019破解版可以轻松将扫描件.图像.网页 ...
- webpack(3)-管理资源
管理资源:(file-loader 和 url-loader 可以接收并加载任何文件,然后将其输出到构建目录) 加载css:style-loader.css-loader 以style的形式插入到he ...
- Oracle数据库查询所有关键字
管理员账户登录后,执行以下命令: select * from v$reserved_words
- pwn学习日记Day3 基础知识积累
知识杂项 msfVENOM:Msfvenom是msf框架配套的攻击载荷生成器. payload:有效载荷. payload:目标系统上渗透成功后执行的代码. Metasploit:一款开源的安全漏洞检 ...