多态

简化条件表达式之以多态取代条件表达式(Replace Conditional with Polymorphism)

我怕爱的太早我们不能终老 提交于 2019-12-19 12:30:19
你手上一个条件表达式,它根据对象类型的不同而选择不同的行为。 将这个条件表达式的每个分支放进一个子类的覆写函数中,然后将原始函数声明为抽象函数。 动机:多态的最根本的好处是:如果你需要根据对象的不同类型而采取不同的行为,多态使你不必编写某些的条件表达式。 正因为有了多态,所以你会发现:“类型吗的switch语句”以及 ”基于类型名称的if-then-else语句“在面向对象程序中很少出现。 多态能够给你带来很多好处。如果同一组条件表达式在程序的许多地点出现,那么使用多态的收益是最大的。使用条件表达式时,如果你想添加一种新类型,就必须查找并更新所有条件表达式。但如果使用多态,只需建立一个新的子类,并在其中提供适当的函数就行了。类的用户不需要了解这个子类,这就大大降低了系统各部分之间的依赖,使系统升级更加容易。 class Engineer extends EmployeeType{ int getTypeCode(){ return Employee.ENGINEER; } } class Manager extends EmployeeType{ int getTypeCode(){ return Employee.MANAGER; } } class Salesman extends EmployeeType{ int getTypeCode(){ return Employee

C++中的多态

╄→尐↘猪︶ㄣ 提交于 2019-12-19 10:36:38
C++中多态 多态(Polymorphism)按字面的意思就是“多种状态”。在面向对象语言中,接口的多种不同的实现方式即为多态。引用Charlie Calverts对多态的描述——多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。多态性在C++中通过虚函数实现的。 形式 C++中的多态性具体体现在运行和编译两个方面。运行时多态是动态多态,其具体引用的对象在运行时才能确定。编译时多态是静态多态,在编译时就可以确定对象使用的形式。多态就是允许方法重名参数或返回值可以是父类型传入或返回。C++中,实现多态有以下方法: 虚函数; 抽象类; 覆盖; 模板(重载和多态无关)。 作用 1.把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。 2.赋值之后,父类型的引用就可以根据当前赋值给它的子对象的特性以不同的方式运作。也就是说,父亲的行为像儿子,而不是儿子的行为像父亲。 class A { public : A ( ) { } virtual void foo ( ) { cout << "This is A." << endl ; } } ; class B : public A

Java多态之动态绑定

让人想犯罪 __ 提交于 2019-12-19 06:06:24
文章目录 Java多态之动态绑定 引用变量的类型 编译时类型 运行时类型 方法绑定 静态绑定 动态绑定 方法表 Java多态之动态绑定 上篇回顾:多态是面向对象程序设计非常重要的特性,它让程序拥有 更好的可读性和可扩展性。 发生在继承关系中。 需要子类重写父类的方法。 父类类型的引用指向子类类型的对象。 自始至终, 多态都是对于方法而言 ,对于类中的成员变量,没有多态的说法。 上篇说到:一个基类的引用变量接收不同子类的对象将会调用子类对应的方法,这其实就是 动态绑定 的过程。在理解动态绑定之前,先补充一些概念。 引用变量的类型 引用类型的变量具有两种类型: 编译时类型 和 运行时类型 。(也分别叫做声明类型和实际类型)举个简单的例子: //假设Student类是Person类的子类 Person p = new Student ( ) ; 编译时类型 也叫声明类型,即由 声明变量时 的类型所决定。 上式的 Person 即为引用变量p的编译时类型。 运行时类型 也叫实际类型,即由指向 对象的实际类型 所决定。 上式的 Student 即为引用变量p的运行时类型。 方法绑定 将方法调用同方法主体关联起来被称为 绑定 。 静态绑定 在程序执行前进行绑定,叫做静态绑定,也称作前期绑定。在面向过程的语言中是默认的绑定方式。 在Java中, 用private

《程序设计与数据结构》第二周学习总结

白昼怎懂夜的黑 提交于 2019-12-19 02:31:05
学号 20172326 《程序设计与数据结构》第二周学习总结 教材学习内容总结 栈遵循后进先出的的方式 对于一个栈,所有的操作都是从一端开始的。所以要寻求适合的数据结构来处理问题。 封装,继承,多态。封装是将部分变量,方法(的 内部细节)隐藏起来,使得不可见,从而提高安全性;继承,子类继承父类,提高代码的利用性;多态,在继承的基础上,重写父类的方法。 泛型提供了一种“宽泛” 的数据类型,使得返回值可以随方法的需要返回所需要的类型。 链表是先进先出的链式结构 教材学习中的问题和解决过程 问题1:泛型的理解,探究 问题1理解:什么是泛型,最直观的感受,就是一个类头中跟了一个 并取代了具体的数据类型的返回值。这就是泛型。意义在哪里呢?可以想见,对一个类,我们需要确定其返回值,同时,类内也需要别的计算过程,需要别的数据类型,不同的数据类型如果分别用各种数据类型定义,太过繁琐,效率太低。如果使用数据类型强制转换,可能导致程序奔溃或计算错误。同时,不同的数据类型存储在一起也不会出现错误。 问题2:继承中的super方法 问题2理解:在书中的一行代码中,在新建一个异常类时,使用到了,super方法 super("The "+ collection +"is empty."); super方法意味着什么呢?直接调用父类构造方法,同时也可以调用父类隐藏的方法,变量。 问题3:多态与重构的区别 理解

继承与多态

半世苍凉 提交于 2019-12-18 21:29:15
继承 单继承 继承的语法 子类继承自父类,可以直接获得父类中的方法和属性 #创建爷爷类 class grandF ( object ) : def __init__ ( self ) : print ( "grandF被调用!" ) self . name = "grandfather" def test ( self ) : print ( "test:" , self . name ) #创建父亲类 class father ( grandF ) : def __init__ ( self ) : print ( "father is here now!" ) self . name = "father" print ( "创建爷爷类:" ) g = grandF ( ) g . test ( ) >> > 创建爷爷类: >> > grandF被调用! >> > test : grandfather print ( "创建父亲类:" ) f = father ( ) f . test ( ) >> > 创建父亲类: >> > father is here now! >> > test : father 注:父亲类并没有创建test类,其继承自爷爷类 方法重写 重写有两种情况: 子类覆盖父类方法 子类扩展父类方法 现在定义mother类,继承自grandF,但重写test方法

学习Java的第十一天------多态

≡放荡痞女 提交于 2019-12-18 15:40:27
多态 1. 多态 package com . qfedu . a ; // 动物类 class Animal { } // 狗类,狗是一种动物 class Dog extends Animal { } // 单身狗,也是一种动物 class SingleDog extends Animal { } // 程序猿,也是一种动物 class CodingMonkey extends Animal { } public class Demo1 { public static void main ( String [ ] args ) { Animal animal = new Animal ( ) ; Dog dog = new Dog ( ) ; SingleDog singleDog = new SingleDog ( ) ; CodingMonkey codingMonkey = new CodingMonkey ( ) ; teachAnimal ( animal ) ; // dog类对象是动物类对象 teachAnimal ( dog ) ; // singleDog类对象也是动物对象 teachAnimal ( singleDog ) ; // codingMonkey类对象同样也是动物对象 teachAnimal ( codingMonkey ) ; } /** *

第49课.多态的概念和意义

余生颓废 提交于 2019-12-18 07:22:30
1.面向对象中期望的行为 a.根据实际的对象类型判断如何调用重写函数 b.父类指针(引用)指向  1).父类对象则调用父类对象中定义的函数  2).子类对象则调用子类对象中定义的函数 2.面向对象中的多态的概念 a.根据实际的对象类型决定函数调用的具体目标 b.同样的调用语句在实际运行时有多种不同的表现形态 3.虚函数 a.通过使用 virtual 关键字对多态进行支持 b.被 virtual 声明的函数被重写后具有多态特性 c.被 virtual 声明的函数叫做 虚函数 eg: #include <iostream> #include <string> using namespace std; class Parent { public: virtual void print() { cout << "I'm Parent." << endl; } }; class Child : public Parent { public: virtual void print() { cout << "I'm Child." << endl; } }; void how_to_print (Parent* p) { p->print(); } int main() { Parent p; Child c; how_to_print(&p); how_to_print(&c); //

多态实现的原理------新标准c++程序设计

血红的双手。 提交于 2019-12-18 03:40:45
“多态”的关键在于通过基类指针或引用调用一个虚函数时,编译时不确定到底调用的是基类还是派生类的函数,运行时才确定。例子: #include<iostream> using namespace std; class A{ public: int i; virtual void func(){}; virtual void func2(){};   //如果为只有一个去掉 virtual 关键字即virtual void func2(){};变为 void func2(){}; 输出结果不变 仍为 8,12 }; //当 virtual 关键字都去掉时,结果才为 4,8 class B :public int j; void func(){} }; int main(){ cout<<sizeof(A)<<","<<sizeof(B); };   输出结果: 8,12   如果将程序中的 virtual 关键字去掉: #include<iostream> using namespace std; class A{ public: int i; void func(){}; void func2(){}; }; class B :public A{ int j; void func(){} }; int main(){ cout<<sizeof(A)<<","<<sizeof(B); }

hello world

十年热恋 提交于 2019-12-18 02:55:37
面向对象 构造方法 特点: 方法名和类名相同,没有返回值 作用: 1:使用new关键字的时候会调用到构造器。本质是在调用构造器。 2:用来初始化对象 注意 无参构造默认存在(隐式存在),但是在定义了有参构造之后必须显式定义无参构造。 类与对象的总结 类是一个模板是抽象的,对象是类的实例。 八大基本数据类型: Java中的数据类型,分为引用类型和基本数据类型。基本类型又分为8种: 整型:byte,short,int,long 浮点型:float,double 字符型:char Boolean型:boolean 封装 作用: 高内聚低耦合 1、提高程序的安全性,保护数据 2、隐藏代码的细节 3、统一接口 4、增强了程序的可维护性 继承 (在Java中所有的类都默认继承Object类) 继承的本质是对类进行抽象,从而实现对现实事物更好的建模。 子类(派生类)是父类(基类)的扩展。 子类继承父类,使用关键字 extends 表示。例如:public class Student extends Person(){...} 子类只能继承一个父类 父类中私有的方法不能被继承 关于super与this的用法 在一个类中,this表示使用当前类的属性,而super则表示使用父类中的属性。 注意: 1、super调用父类的构造方法,必须在构造方法的第一行 2

java基础之接口和多态

℡╲_俬逩灬. 提交于 2019-12-17 15:09:37
   接口和多态 1.接口的概述: 描述的是事物的一种扩展行为 定义接口的格式: 使用关键字 interface, 将定义类中的class换成interface即可 public interface 接口名{ // 成员变量(常量)如果是常量,一般习惯写成大写 // 成员方法(抽象方法) } 接口中的成员特点: 成员变量: 默认被public static final修饰了,不管写不写都有 成员方法: 默认被public abstract 修饰了, 不管写不写都有 如何使用接口? 特点: 接口不能被new,不能被实例化 接口的使用方式, 研究类和接口之间的关系: 接口与类之间是实现关系, 使用关键字 implements 格式: public class 类A implements 接口名A{ 覆盖接口中的所有抽象方法, 除非这个类也是抽象类. } 1> 一个类实现一个接口 格式: public class 类A implements 接口A{....} 2> 一个类实现多个接口 格式: public class 类A implements 接口A, 接口B{....} 3> 一个类继承另外一个类, 实现多个接口 格式: public class 类A extends 类B implements 接口A,接口B{...} 福利: 面试题一: interface InterA{