多态

多态是指两个或多个属于不同类的对象,对同一个消息(方法调用)做出不同响应的能力。

多态(《韦氏大词典》)中定义:可以呈现不同形式的能力或状态。

C#如何实现多态的知识——即继承上覆载。继承和覆载合起来实现了多态。

多态的优点:降低了在应用程序分发后,需求发生不可避免的改变时在已存在应用中导致的连锁反应。

还记得上一节那个“多重继承”吗?那对象应该如何表现出两个或多个不同对象类型的行为?

抽象类

抽象类用来列举一个类所需要的行为,但不明确提供每个行为的具体实现方法。只要一个类包括一个或多个抽象方法,该类就必须是抽象类,定义抽象类的手段是在类声明中加上abstract关键字。

注意,抽象类中的方法并不一定都是抽象方法;抽象方法也可容纳有方法体的方法,或称具体方法。

抽象类有什么限制吗?

对于抽象类有一个限制:它们不能被实体化。

何时用抽象类?

对于那些我们不能(或不愿)给出普遍实现的行为。

派生类没有实现所有的抽象方法会怎么样?

如果派生类没有从抽象类继承下来的所有抽象方法提供具体实现,则派生类自动被当做抽象类处理。此派生类不能被实体化。

接口

抽象类中可以定义私有attribute,私有的操作。当我们不打算规定将来派生类必须使用怎样的数据结构来实现期望的公共行为,就可以考虑接口。接口可以共同定义应用程序中的一个角色的意义(能进行的操作)。当然接口可以是公共的,也可以是私有的,不过一般都声明为公共的。接口中的方法都隐含地是公共机抽象方法。

继承被看做是一种“is  a”关系,接口也被看做另一种“is  a”关系。

 抽象类vs接口

  1. 从程度上看,接口要比抽象类更为抽象(而抽象类则比具体类来得抽象)。
  2. 当从一个抽象类派生出一个非抽象类时,派生类通过覆载的手段,通过抽象方法的具体实现。
  3. 当一个类实现一个接口时,该实现类也要提供接口中声明的所有方法具体实现。然而,实现类并不覆载它们(抽象类中多数用的是重写实现)。
  4. 抽象类派生的类不一定要覆载所有的抽象方法、提供具体版本;如果一个或多个抽象方法没有被覆载,则该派生类也是一个抽象类;
  5. 实现一个接口的类必须提供接口所需的所有抽象方法的具体版本;实现一个接口,是一种“要么全要,要么不要”的事情。
  6. 两者之间的另一个重要区别在于,一个类只能从一个基类派生,而一个类却可以实现多个接口。

实现多个接口时遇到相同的方法签名时怎么办?

如果一个类实现的两个货多个接口中的方法拥有同样的方法签名,则在实现类中只需要实现其中一个——该方法同时满足所有接口的实现要求。

接口的优势

当一个类同时扩展单个基类和实现一个或多个接口时。编译器仅将冒号后的第一项看作基类,列表中后面的一切都被假定为接口。接口不能被实体化,因为接口中没有构造器,虽然不能实体化一个接口,但却能把引用变量声明为一个接口类型。

一个类实现了超过一个接口,它的对象就有能力扮演应用程序中的多种身份或角色;这样的对象可以为不同类型的引用变量所维系。这个概念等同于作为一个人的你,被不同人当做不同角色看待的情形:在经理眼里你是雇员,在父母眼里你是孩子,在孩子眼里你是父母等等。

例如:

Iteacher t=new Professor();(现在知道为什么允许了吗?)

Professor类实现了Iteacher接口,教授就是教师,所以这种赋值是被允许的。从编译角度来说,如果等号的表达式的类型与左边变量的类型匹配,编译器就允许赋值操作,显然编译器是认为类型是匹配的。

接口的应用:

只要有可能,就应该吧类的公共部分设计为接口,而不是设计为特定的类类型,这样就可以让方法在多个方面拥有更更多灵活性。

Ps:抽象类和接口定义对象的任务,而无须陷入定义对象如何实现其任务的麻烦中区,以及为什么需要这么做。就好比规定人吃饭而不管你怎么样吃!(细嚼慢咽、狼吞虎咽)。当然和上面的多态、继承也是有关系的。

C# 面向对象之概念理解(3)的更多相关文章

  1. C# 面向对象之概念理解

    什么是对象? <韦氏大词典>中对对象定义: (1)某种可为人所感知的物质. (2)思维.感受或动作所作用的物质或精神体. ----说白了万物皆对象 熟悉的对象描述: 对象就是客观世界中的物 ...

  2. C# 面向对象之概念理解(2)

    委托 如果对象A为了满足某个请求,而寻求另一个对象B的帮助,这被称作是A对B的委托. 对象间的委托,和现实世界中人与人之间的委托一样:如果你“那位”要求你在他外出公干期间帮忙助剪草坪,而你转而雇佣邻居 ...

  3. JAVA_SE基础——22.面向对象的概念

    我写博客是为了提升自己和为了进入黑马程序员学习,还有分享些自己的心得给大家,希望能帮助大家学习JAVA. 我是自学的,如果写的有错误或者能更好的修改的请提出. 在这里我先引用下<think in ...

  4. 我对面向对象设计的理解——Java接口和Java抽象类

    在没有好好地研习面向对象设计的设计模式之前,我对Java接口和Java抽象类的认识还是很模糊,很不可理解. 刚学Java语言时,就很难理解为什么要有接口这个概念,虽说是可以实现所谓的多继承,可一个只有 ...

  5. OO 面向对象的概念

    面向对象的概念 一.什么是面向对象? 传统的:世间万物都是对象.例如:桌子,凳子,电脑等: 个人理解: 1.软件开发方法: 2.面向对象是一种解决问题和分析问题的(编程)一种思想: 3.他是通过面向过 ...

  6. OC学习--面向对象的个人理解

    1. 什么是面向对象? 以下一段话是我在百度上找的解释: 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面 ...

  7. 03.JavaScript 面向对象精要--理解对象

    JavaScript 面向对象精要--理解对象 尽管JavaScript里有大量内建引用类型,很可能你还是会频繁的创建自己的对象.JavaScript中的对象是动态的. 一.定义属性 当一个属性第1次 ...

  8. JAVA类与对象(一)----基础概念理解

    面向对象基本概念 面向对象是一种新兴的程序设计方法,或者说是一种新的程序设计规范,其基本思想是使用对象.类.继承.封装.消息等基本概念来进行程序设计.它是从现实世界客观存在的事物(即对象)出发来构造软 ...

  9. [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示

    javascript面向对象编程方式,对于初学者来说,会比较难懂. 要学会面向对象以及使用面向对象编程,理解对象的创建在内存中的表示,至关重要. 首先,我们来一段简单的对象创建代码 var obj = ...

随机推荐

  1. OpenSUSE 安装并启动Tomcat

    安装.用YsST2搜索tomcat安装就好了.不过版本肯定不如官网的新,笔者用的是7.0.42,最新的已经到8.X了. 启动.在服务管理器中找到tomcat,启动.

  2. Mongodb 级联删除查询操作

    ObjRelationPojo表一条记录 public class YpObjRelationPojo implements Serializable { @Id private String id; ...

  3. 使用socket.io搭建聊天室

    最近在学习nodejs,需要找一些项目练练手.找来找去发现了一个聊天室的教程,足够简单,也能从中学到一些东西.下面记录我练习过程中待一些笔记. nodeJS模块 共用到了2个模块,express和so ...

  4. 一个PHP加密脚本,达到一定免杀效果

    <?php /**************************************** *author: L.N. *blog : [url]http://lanu.sinaapp.co ...

  5. TextView文字排版问题:

    本文转载自:http://blog.sina.com.cn/s/blog_821e2bb101011803.html textview自动换行导致混乱的原因----半角字符与全角字符混乱所致!一般情况 ...

  6. 在HTML中通过jQuery设置列表项符号

    在创建列表的时候,可以通过指定type来设置列表项的符号,如下所示: <body> <form id="form1" runat="server&quo ...

  7. Spark菜鸟学习营Day5 分布式程序开发

    Spark菜鸟学习营Day5 分布式程序开发 这一章会和我们前面进行的需求分析进行呼应,完成程序的开发. 开发步骤 分布式系统开发是一个复杂的过程,对于复杂过程,我们需要分解为简单步骤的组合. 针对每 ...

  8. git add 命令详解

    或"表示git会例出索引库中的文件列表中的第个文件."-"表示git会例出索引库中的文件列表中的第个文件到第个文件.回车将执行.如果我们不输入任何东西,直接回车,将结束r ...

  9. 2016 医疗项目 Bootstrap 自适应页面布局(1)

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  10. js 截取某个字符前面或者后面的字符串

    /* string 字符串; str 指定字符; split(),用于把一个字符串分割成字符串数组; split(str)[0],读取数组中索引为0的值(第一个值),所有数组索引默认从0开始; */ ...