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 = ...
随机推荐
- THREE.js代码备份——线框cube、按键、鼠标控制
<!DOCTYPE html> <html lang="en"> <head> <title>three.js canvas - g ...
- Java包的命名规则
按照惯例,包申明遵循特定的格式.虽然不是严格要求的Java语法,如果不遵循格式要求,大多数的Java认为你是不懂Java. 从右到左的顺序是: 1.systaxExample表明包的本地名称. 2.e ...
- git服务器简易搭建法
受尽svn各种折磨的小伙伴都听说过git. 但是网上一搜索, 本来打算跟svn一样. 下一个服务器, 装下就可以开始用了. 没想到啊, 没想到. 居然需要Linux天赋点… 好吧, 拜鸟哥门下把Lin ...
- 简单实用的PHP验证码类
一个简单实用的php验证码类,分享出来 ,供大家参考. 代码如下: <?php /** @ php 验证码类 @ http://www.jbxue.com */ Class code { var ...
- php正则表达式总结第1弹
介绍几个我用到的php正则表达式 1. 一篇文章的链接,我需要去掉以 /hotels/打头的链接,可用下面正则 $content = preg_replace('/<a(.*?)href=&qu ...
- WCF全面解析第二章 地址(Adress)
2.1 统一资源标识(URL) 2.1.1 Http/Https 2.1.2 Net.TCP 2.1.3 Net.Pipe WCF只将命名管道专门用于同一台机器的跨进程通信. 2.1.4 Net.Ms ...
- Requests库的几种请求 - 通过API操作Github
本文内容来源:https://www.dataquest.io/mission/117/working-with-apis 本文的数据来源:https://en.wikipedia.org/wiki/ ...
- 表达式语言之java对正则表达式的处理
正则表达式用于字符串匹配,字符串查找,字符串替换等.例如注册email格式的验证等.java中处理正则表达式相关的类主要有java.lang.String,java.util.regex.Patter ...
- 【F#】 WebSharper框架
WebSharper,它是一个基于F#构建的Web开发平台,使用F#构造从前到后的一整套内容.其中利用到F#中许多高级的开发特性,并可以将F#代码直接转化JavaScript,这样服务器端和客户端的通 ...
- Entity Framework学习笔记(六)----使用Lambda查询Entity Framework(1)
请注明转载地址:http://www.cnblogs.com/arhat 在前几章中,老魏一直使用Linq来查询Entity Framework.但是老魏感觉,如果使用Linq的话,那么Linq的返回 ...