C# 面向对象之概念理解(3)
多态
多态是指两个或多个属于不同类的对象,对同一个消息(方法调用)做出不同响应的能力。
多态(《韦氏大词典》)中定义:可以呈现不同形式的能力或状态。
C#如何实现多态的知识——即继承上覆载。继承和覆载合起来实现了多态。
多态的优点:降低了在应用程序分发后,需求发生不可避免的改变时在已存在应用中导致的连锁反应。
还记得上一节那个“多重继承”吗?那对象应该如何表现出两个或多个不同对象类型的行为?
抽象类
抽象类用来列举一个类所需要的行为,但不明确提供每个行为的具体实现方法。只要一个类包括一个或多个抽象方法,该类就必须是抽象类,定义抽象类的手段是在类声明中加上abstract关键字。
注意,抽象类中的方法并不一定都是抽象方法;抽象方法也可容纳有方法体的方法,或称具体方法。
抽象类有什么限制吗?
对于抽象类有一个限制:它们不能被实体化。
何时用抽象类?
对于那些我们不能(或不愿)给出普遍实现的行为。
派生类没有实现所有的抽象方法会怎么样?
如果派生类没有从抽象类继承下来的所有抽象方法提供具体实现,则派生类自动被当做抽象类处理。此派生类不能被实体化。
接口
抽象类中可以定义私有attribute,私有的操作。当我们不打算规定将来派生类必须使用怎样的数据结构来实现期望的公共行为,就可以考虑接口。接口可以共同定义应用程序中的一个角色的意义(能进行的操作)。当然接口可以是公共的,也可以是私有的,不过一般都声明为公共的。接口中的方法都隐含地是公共机抽象方法。
继承被看做是一种“is a”关系,接口也被看做另一种“is a”关系。
抽象类vs接口
- 从程度上看,接口要比抽象类更为抽象(而抽象类则比具体类来得抽象)。
- 当从一个抽象类派生出一个非抽象类时,派生类通过覆载的手段,通过抽象方法的具体实现。
- 当一个类实现一个接口时,该实现类也要提供接口中声明的所有方法具体实现。然而,实现类并不覆载它们(抽象类中多数用的是重写实现)。
- 抽象类派生的类不一定要覆载所有的抽象方法、提供具体版本;如果一个或多个抽象方法没有被覆载,则该派生类也是一个抽象类;
- 实现一个接口的类必须提供接口所需的所有抽象方法的具体版本;实现一个接口,是一种“要么全要,要么不要”的事情。
- 两者之间的另一个重要区别在于,一个类只能从一个基类派生,而一个类却可以实现多个接口。
实现多个接口时遇到相同的方法签名时怎么办?
如果一个类实现的两个货多个接口中的方法拥有同样的方法签名,则在实现类中只需要实现其中一个——该方法同时满足所有接口的实现要求。
接口的优势
当一个类同时扩展单个基类和实现一个或多个接口时。编译器仅将冒号后的第一项看作基类,列表中后面的一切都被假定为接口。接口不能被实体化,因为接口中没有构造器,虽然不能实体化一个接口,但却能把引用变量声明为一个接口类型。
一个类实现了超过一个接口,它的对象就有能力扮演应用程序中的多种身份或角色;这样的对象可以为不同类型的引用变量所维系。这个概念等同于作为一个人的你,被不同人当做不同角色看待的情形:在经理眼里你是雇员,在父母眼里你是孩子,在孩子眼里你是父母等等。
例如:
Iteacher t=new Professor();(现在知道为什么允许了吗?)
Professor类实现了Iteacher接口,教授就是教师,所以这种赋值是被允许的。从编译角度来说,如果等号的表达式的类型与左边变量的类型匹配,编译器就允许赋值操作,显然编译器是认为类型是匹配的。
接口的应用:
只要有可能,就应该吧类的公共部分设计为接口,而不是设计为特定的类类型,这样就可以让方法在多个方面拥有更更多灵活性。
Ps:抽象类和接口定义对象的任务,而无须陷入定义对象如何实现其任务的麻烦中区,以及为什么需要这么做。就好比规定人吃饭而不管你怎么样吃!(细嚼慢咽、狼吞虎咽)。当然和上面的多态、继承也是有关系的。
C# 面向对象之概念理解(3)的更多相关文章
- C# 面向对象之概念理解
什么是对象? <韦氏大词典>中对对象定义: (1)某种可为人所感知的物质. (2)思维.感受或动作所作用的物质或精神体. ----说白了万物皆对象 熟悉的对象描述: 对象就是客观世界中的物 ...
- C# 面向对象之概念理解(2)
委托 如果对象A为了满足某个请求,而寻求另一个对象B的帮助,这被称作是A对B的委托. 对象间的委托,和现实世界中人与人之间的委托一样:如果你“那位”要求你在他外出公干期间帮忙助剪草坪,而你转而雇佣邻居 ...
- JAVA_SE基础——22.面向对象的概念
我写博客是为了提升自己和为了进入黑马程序员学习,还有分享些自己的心得给大家,希望能帮助大家学习JAVA. 我是自学的,如果写的有错误或者能更好的修改的请提出. 在这里我先引用下<think in ...
- 我对面向对象设计的理解——Java接口和Java抽象类
在没有好好地研习面向对象设计的设计模式之前,我对Java接口和Java抽象类的认识还是很模糊,很不可理解. 刚学Java语言时,就很难理解为什么要有接口这个概念,虽说是可以实现所谓的多继承,可一个只有 ...
- OO 面向对象的概念
面向对象的概念 一.什么是面向对象? 传统的:世间万物都是对象.例如:桌子,凳子,电脑等: 个人理解: 1.软件开发方法: 2.面向对象是一种解决问题和分析问题的(编程)一种思想: 3.他是通过面向过 ...
- OC学习--面向对象的个人理解
1. 什么是面向对象? 以下一段话是我在百度上找的解释: 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面 ...
- 03.JavaScript 面向对象精要--理解对象
JavaScript 面向对象精要--理解对象 尽管JavaScript里有大量内建引用类型,很可能你还是会频繁的创建自己的对象.JavaScript中的对象是动态的. 一.定义属性 当一个属性第1次 ...
- JAVA类与对象(一)----基础概念理解
面向对象基本概念 面向对象是一种新兴的程序设计方法,或者说是一种新的程序设计规范,其基本思想是使用对象.类.继承.封装.消息等基本概念来进行程序设计.它是从现实世界客观存在的事物(即对象)出发来构造软 ...
- [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
javascript面向对象编程方式,对于初学者来说,会比较难懂. 要学会面向对象以及使用面向对象编程,理解对象的创建在内存中的表示,至关重要. 首先,我们来一段简单的对象创建代码 var obj = ...
随机推荐
- unity 多线程
对于客户端来说,好的用户体验,需要保持一个快速响应的用户界面.于是便要求:网络请求.io操作等 开销比较大的操作必须在后台线程进行,从而避免主线程的ui卡顿.(注:协程也是主线程的一部分,进行大量的i ...
- rest介绍
REST介绍 描述 rest即表述性状态传递(英文:Representational State Transfer,简称REST)是Roy Fielding博士在2000年他的博士论文中提出来的一种软 ...
- asp.net mvc常用的数据注解和验证以及entity framework数据映射
终于有时间整理一下asp.net mvc 和 entity framework 方面的素材了. 闲话少说,步入正题: 下面是model层的管理员信息表,也是大伙比较常用到的,看看下面的代码大伙应该不会 ...
- Freezable 对象(WPF)
# Freezable 对象(WPF) # > Freezable 继承自 DependencyObject,同时添加了 Freezable 方法,用于冻结对象. --- ## 冻结对象 ## ...
- Oracle中排序列中值相同引发的问题(译)
This queston came up on the Oracle newsgroup a few days ago: 这个问题在Oracle的新闻中心被提出了一段时间: I have a tabl ...
- php出现“syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM”错误的一种情况,及解决方法
PHP中的“syntax error, unexpected T_PAAMAYIM_NEKUDOTAYIM”错误,可能是因为美元符号$的误用,看下面一种情况 class Test{ s ...
- jdbc 连接 mysql 获取 数据集 条数
package nona; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; im ...
- jquery 清空表达内容
function clearForm(objE) { $(objE).find(':input').each( function() { switch (this.type) { case 'pass ...
- Boost的自动链接功能
Boost是一个强大的C++第三方库,但是Boost的各种问题实在是很让人蛋疼.我搜到过一篇文章关于LuaBind使用Boost Build管理工具来管理源代码以及编译的博文,其第一句话就是Fuck ...
- Python脚本控制的WebDriver 常用操作 <十三> 处理button group层的定位
下面将使用webdriver来定位同一层的按钮 测试用例场景 button group就是按钮组,将一组按钮排列在一起. 处理这种对象的思路一般是先找到button group的包裹(wrapper) ...