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 = ...
随机推荐
- ProgressIndicator显示进度条以及一些文字信息
//ProgressIndicator可以显示进度条以及一些文字信息,不过这个属性一般都在cs文件中操作. private void PhoneApplicationPage_Loaded(objec ...
- 而在Jquery中则使用$.map()、$.each()来操作数组
首先是普通的数组(索引为整数的数组): //$.map(arr,fn); //对数组中的每个元素调用fn函数逐个进行处理,fn函数将处理返回最后得到的一个新的数组 var arr = [9, 8, 7 ...
- [大牛翻译系列]Hadoop(17)MapReduce 文件处理:小文件
5.1 小文件 大数据这个概念似乎意味着处理GB级乃至更大的文件.实际上大数据可以是大量的小文件.比如说,日志文件通常增长到MB级时就会存档.这一节中将介绍在HDFS中有效地处理小文件的技术. 技术2 ...
- jquery实现密码框显示提示文字
jquery实现密码框提示文字的功能. 代码: <html> <head> 3 <title>登录-jquery实现密码框显示文字-www.jbxue. ...
- 如何去掉html中的超链接
$a= preg_replace("/<a[^>]+>/", "", $a); $a= preg_replace("/<\/a ...
- 在Java中执行js代码
在某些特定场景下,我们需要用Java来执行Js代码(如模拟登录时,密码被JS加密了的情况),操作如下: ScriptEngineManager mgr = new ScriptEngineManage ...
- 一段Android里面打印CallStatck的代码
public void dumpCallStack() { java.util.Map<Thread, StackTraceElement[]> ts = Thread.getAllSta ...
- IOS开发实现录音功能
导入框架: ? 1 #import <AVFoundation/AVFoundation.h> 声明全局变量: ? 1 2 3 4 5 @interface ViewController ...
- Enterprise Library 6——Using the Logging Application Block
原文参考 http://msdn.microsoft.com/en-us/library/dn440731(v=pandp.60).aspx 一.简介 .更重要的是用于审计.这种日志可以跟踪用户的行为 ...
- ADO.NET- 基础总结及实例介绍
最近闲暇时间写的一些小程序中,访问数据库比较多:下面主要介绍下ADO.NET方面知识,有不足之处,希望大神们不吝赐教: 提到ADO.NET,经常会和ASP.NET进行混淆,两者的区别很大,没有可比性, ...