多态

多态与鸭子和反射

一个人想着一个人 提交于 2019-12-06 12:46:48
一、多态 1.什么是多态? 多态指同一类型的事物的,不同形态。 2.多态的目的: 多态也称之为多态性,目的是为了在不知道对象具体类型的情况下统一对象🙆调用方法的规范。 多态的表现形式之一就是继承: 先抽象,再继承。 父类:定制一套统一的规范。 子类:遵循父类的统一的的规范。 注意:在python中不会强制限制子类必须遵循父类的规范,所以出现了抽象类。 class Animal: def eat(self): pass​ def speak(self): pass​​class Pig(Animal): def eat(self): print('一口没')​ def speak(self): print('哼哼哼')​​class Cat(Animal): def eat(self): print('慢慢吃') def speak(self): print('喵喵喵')​​class Dog(Animal): def eat(self): print('还有吗') def speak(self): print('汪汪汪')​animal = Pig()animal1 = Cat()animal2 = Dog()​animal.eat()animal1.eat()animal2.eat()​animal.speak()animal1.speak()animal2.speak(

一起学Java(十九)-----多态

此生再无相见时 提交于 2019-12-06 10:58:34
不积跬步,无以至千里;不积小流,无以成江海。 Java语言基础 Java多态 面向对象程序设计中代码重用的一个重要机制,父类/接口的多种不同实现方式即为多态。 多态的表现形式 编译时多态 方法的重载,同一个类中有多个同名方法,当方法的参数不同时,编译时就可以确定调用哪个方法,是同一个类中多态性的表现方式。 运行时多态 方法的重写,子类可以重写父类的方法,同样的方法在父类与子类中有着不同的表现形式。父类的引用可以指向子类对象,程序调用的方法在运行期才动态绑定, 多态存在的必要条件 1、要有继承 2、要有重写 3、父类引用指向子类对象 定义一个父类: class Person { private String name; private int age; int i = 5; public Person(){} public Person(String name, int age){ this.name = name; this.age = age; } public String getname(){ return name; } public void setname(String name){ this.name = name; } public int getage(){ return age; } public void setage(int age){ this.age =

27.Java基础_多态

懵懂的女人 提交于 2019-12-06 08:34:35
父类对象引用子类对象: Animal a=new Cat(); 多态中的转型 public class Animal { public void eat(){ System.out.println("动物吃东西"); } } public class Cat extends Animal{ @Override public void eat() { System.out.println("猫吃鱼"); } public void playGame(){ System.out.println("猫捉迷藏"); } } public class test { public static void main(String[] args) { //多态 Animal a=new Cat(); //向上转型 a.eat(); //猫吃鱼 //a.playGame(); 会报错 //创建Cat类的对象 Cat b=(Cat)a; //向下转型,来解决多态不能使用子类特有功能的问题 b.eat(); //猫吃鱼 b.playGame(); //猫捉迷藏 } } 来源: https://www.cnblogs.com/NiBosS/p/11972616.html

C++ 基础语法 快速复习笔记(3)---重载函数,多态

流过昼夜 提交于 2019-12-06 07:47:20
1.重载运算符和重载函数: C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。 当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。 选择最合适的重载函数或重载运算符的过程,称为重载决策。 a.函数重载: 在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同。您不能仅通过返回类型的不同来重载函数。 b.运算符重载: 您可以重定义或重载大部分 C++ 内置的运算符。这样,您就能使用自定义类型的运算符。 重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。 详细例子: https://www.runoob.com/cplusplus/cpp-overloading.html 2.多态: 多态按字面的意思就是多种形态。当类之间存在层次结构,并且类之间是通过继承关联时,就会用到多态。 C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数。 例子: https://www.runoob

封装、继承、多态

谁都会走 提交于 2019-12-06 07:03:53
封装是面向对象的三大特性之一 封装指的是隐藏对象中的一些不希望被外部所访问的属性或方法 如果隐藏一个对象中的属性? 将对象的属性名,修改为一个外部不知道的名字 如何获取(修改)对象中的属性? 需要提供一个getter和setter方法使外部可以访问到属性 getter 获取对象中指定属性(getter_属性名) setter 用来设置对象中指定属性(setter_属性名) 使用封装,确实增加了类的定义的复杂程度,但是它也确保了数据的安全性 隐藏了属性名,使用调用者无法随意的修改对象的属性确保了数据的安全性 增加了getter和setter方法,很好的控制了属性是否是只读的 如果希望属性是只读的,则可以直接去掉setter方法 如果希望属性不能被外部访问,则可以直接去掉getter方法 使用setter方法设置属性,可以增加数据的验证,确保数据的值是正确的。 使用getter方法获取属性,使用setter方法设置属性 可以在读取属性和修改属性的同时做一些其他的处理 使用getter方法可以表示一些计算的属性 class Dog:'''表示狗的类''' def __init__(self,name): self.hidden_name = name def say_hello(self): print('大家好,我是%s'%hidden_name) def get_name(self)

面向对象的三个特征:封装(抽象)、继承、多态

旧街凉风 提交于 2019-12-06 07:03:44
面向对象的三个特征:封装(抽象)、继承、多态。 继承 : 一种代码重用的方式。 1 、 父类 (基类,超类) 2 、 子类 1). 子类在同一个包下面能够范文父类除了私有 private 修饰的所有属性和方法 2). 在不同包下面 , 子类对象只能访问 public 修饰的属性和方法 3). 在子类内部 , 如果不同包的情况下 , 可以访问 protected 修饰的属性和方法 , 但是不能访问默认的访问修饰符修饰的属性和方法 4). 子类在初始化的时候会先调用父类的默认不带参数构造器 , 如果没有 , 就会报错 , 我们只有人为的修改: 1. 将父类添加一个无参数的构造器 2. 在子类构造器中手动使用 super() 声明调用哪个父类的构造器 3、extends (继承) 例: public class Son extends Father () {} Son : 子类 Father : 父类 子类通过继承父类,可以重用父类中定义的属性和方法。另外,在子类中,还可以定义子类特有的属性和方法。继承采用关键字 extends 。 封装 :按照信息隐藏的原则,将数据组织在一起。封装有两个特点: 信息隐藏,信息集合。 多态:(运行时加载) 1.继承 2.重写 3.父类引用指向子类对象(自动调用子类重写的方法) 允许使用父类(类型的引用)变量指向子类的对象,允许使用接口变量指向实现类对象

多态的C语言实现版本

放肆的年华 提交于 2019-12-06 07:03:11
1 #ifndef _51_2_H 2 #define _51_2_H 3 typedef void Demo; 4 typedef void Derived; 5 Demo* Demo_create(int i,int j); 6 int Demo_geti(Demo*pthis); 7 int Demo_getj(Demo*pthis); 8 int Demo_add(Demo*pthis,int value); 9 void Demo_free(Demo*pthis); 10 11 Derived*Derived_create(int i,int j,int k); 12 int Derived_getk(Derived*pthis); 13 int Derived_add(Derived*pthis,int value); 14 #endif 1 #include<stdio.h> 2 #include"51-2.h" 3 #include<malloc.h> 4 //定义父子类的虚函数 5 static int Demo_virtual_add(Demo*pthis,int value); 6 static int Derived_virtual_add(Derived*pthis,int value); 7 //2。确定虚函数表的类型,虚函数表的结构体,用来创建虚函数表

代码优化-多态代替IF条件判断

落爺英雄遲暮 提交于 2019-12-06 06:47:59
场景描述 在开发的场景中,常常会遇到打折的业务需求,每个用户对应的等级,他们的打折情况也是不一样的。例如普通会员打9折,青铜会员打8.5折,黄金会员打8折等等。在一般开发中最简单的就是判断用户的等级,然后对订单作对应的打折处理。 场景示例 写了一个简单的小示例,如下所示: //1 代表学生 2老师 3校长 int type = 1; if (1 == type) { System.out.println("学生笑嘻嘻的说话"); } else if (2 == type) { System.out.println("老师开心的说话"); } else { System.out.println("校长严肃的说话"); } 上面的代码,是我们经常的做法,代码少的时候,看起来非常清晰,但是代码多起来或者有了更多的判断条件,那上面的代码会更加的混乱,如果每次有修改,都要改动这部分代码。 解决方法 可以把上面的代码改成多态方式,创建三个类,学生Student,老师Teacher,校长HeadMater,父类为Person,这三个类都实现父类的方法say,如下所示: Person.class package me.xueyao.service; /** * @author Simon.Xue * @date 2019-12-01 14:31 **/ public interface

面向对象(三大特性)

断了今生、忘了曾经 提交于 2019-12-06 06:19:16
面向对象具有三大特性:继承、封装、多态 继承 : 如:子类 继承 父类,子类就具备了父类的公共属性和方法。 作用: 1、减少重复代码。 2、成就了类与类的关系,为多态打下基础。 封装: 封装,顾名思义是将内容封装到某个地方,然后再去调用被封装到某处的内容。所以运用面向对象的封装特性时。 需要注意两点: 1、将内容封装到某处 2、从某处调用被封装的内容 作用: 1、就是将常用部分封装起来,在其它地方(包含其它项目)可重复使用, 减少大量冗余代码 。 2、从而达到通用、灵活、独立的效果 (避免Ctrl+C、Ctrl+V) 多态: 多态就是指不同的对象收到相同的消息时,会产生不同的行为,同一个类在不同的场合下表现出不同的行为特征,或不同的状态。 也就是说一个类(父类)具备了多种形态或状态,被称为多态。 作用: 把不同的子类对象都当做父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适用需求不断变化。 来源: https://www.cnblogs.com/qiupiaohujie/p/11965156.html

多态在面向对象中的意义以及带来的好处

孤街醉人 提交于 2019-12-06 05:43:34
多态的概念:相同的行为,不同的实现 什么是静态多态?什么是动态多态? 静态多态 :编译时就已经确定了结果,例如重载和重写 动态多态 :运行时确定结果, 动态多态是依赖什么技术实现的? 继承 重写 向上转型(父类引用指向子类对象 动态多态的好处是什么? 减少了代码的耦合性,后期需要修改的时候只需要添加内容,不用修改之前已经定义的代码。 可以扩展的知识点: 接口的引用也可以指向实现类的对象; 反射实现动态产生对象; Spring完成IOC注入; 桥梁模式、装饰器模式、策略模式等常见设计模式; 聚合组合原则、依赖倒转原则等常见设计原则。 来源: https://www.cnblogs.com/liqking/p/11964523.html