抽象类

C++总结(四)

主宰稳场 提交于 2020-02-15 02:23:48
一、多态 1.多态的概念 多态:同一个事物,在不同场景下表现出的不同的状态 2.多态的分类 静态多态(早绑定,静态联编): 在编译期间,根据所传递的实参类型或者实例化的类型,来确定到底应该调用那个函数即:在编译期间确定了函数的行为—函数重载、模板 动态多态(晚绑定,动态联编):在程序运行时,确定具体应该调用那个函数 3.动态多态的实现条件-- -在继承的体系中 虚函数&重写:基类中必须包含有虚函数(被virtual修饰的成员函数),派生类必须要对基类的虚函数进行重写 关于虚函数调用:必须通过基类的指针或引用调用虚函数 体现:在程序运行时,基类的指针或引用指向那个子类的对象,就会调用那个子类的虚函数 4.重写 1.基类中的函数一定是虚函数 2.派生类虚函数必须与基类虚函数的原型一致:返回值类型 函数名字(参数列表) 例外: a、协变–基类虚函数返回值基类的指针或引用 派生类虚函数返回派生类的指针或引用基类虚函数和派生类虚函数的返回值类型可以不同 b、析构函数:如果将基类中析构函数设置成虚函数,派生类的析构函数提供,两个析构函数就可以构成重写;两个析构函数名字不同 3.基类虚函数可以和派生类虚函数的访问权限不一-样 4、为了让编译器在编译期间帮助用户检测是否重写成功,C+ +11提供非常有用的关键字 1、override:专门]让编译帮助用户检测派生类是否成功重写了基类的虚函数

设计模式------工厂模式和抽象工厂模式

给你一囗甜甜゛ 提交于 2020-02-15 01:11:28
一、工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。 工厂模式在《Java与模式》中分为三类: 1)简单工厂模式(Simple Factory):不利于产生系列产品; 2)工厂方法模式(Factory Method):又称为多形性工厂; 3)抽象工厂模式(Abstract Factory):又称为工具箱,产生产品族,但不利于产生新的产品; 这三种模式从上到下逐步抽象,并且更具一般性。 GOF在《设计模式》一书中将工厂模式分为两类:工厂方法模式(Factory Method)与抽象工厂模式(Abstract Factory)。将简单工厂模式(Simple Factory)看为工厂方法模式的一种特例,两者归为一类。 二、简单工厂模式 简单工厂模式又称 静态工厂方法模式 。重命名上就可以看出这个模式一定很简单。它存在的目的很简单:定义一个用于创建对象的接口。 在简单工厂模式中,一个工厂类处于对产品类实例化调用的中心位置上,它决定那一个产品类应当被实例化, 如同一个交通警察站在来往的车辆流中,决定放行那一个方向的车辆向那一个方向流动一样。 先来看看它的组成: 1) 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。 2) 抽象产品角色:它一般是具体产品继承的父类或者实现的接口

Java学习笔记(八)面向对象---抽象类

此生再无相见时 提交于 2020-02-14 15:29:24
当多个类中出现相同功能,但是功能主体不同时,我们可以向上抽取,只抽取功能定义,而不抽取功能主体。 抽象类的特点 抽象方法一定在抽象类中。 抽象方法和抽象类都必须被abstract关键字修饰。 抽象类不可以用new创建对象,因为调用抽象方法没有意义。 抽象类中的抽象方法要被使用,必须由子类复写所有的抽象方法后,才能建立子类对象调用。(如果子类只覆盖了部分抽象方法,那么该子类还是一个抽象类。) abstract class Student { abstract void study(); abstract void read(); void sleep() { System.out.println("sleep"); } } class StudentClass1 extends Student { void study() { System.out.println("study Java"); } void read() { System.out.println("read book"); } } class StudentClass2 extends Student { void study() { System.out.println("study python"); } void read() { System.out.println("study magazine"); }

Java中的二元操作符:instanceof

假如想象 提交于 2020-02-14 14:11:03
Java中的二元操作符:instanceof 判断一个引用类型的变量所指向的对象是否是一个类(或者接口、抽象类、父类)的实例,即它左边的对象是否是它右边的类的实例,该运算返回boolean类型的数据。 格式: result = object instanceof class; 注:如果object是null,返回false 来源: CSDN 作者: Mason97 链接: https://blog.csdn.net/Mason97/article/details/104308990

依赖倒置原则——面向对象设计原则

二次信任 提交于 2020-02-14 11:00:41
依赖倒置原则的定义 依赖倒置原则(Dependence Inversion Principle,DIP) 是 Object Mentor 公司总裁罗伯特·马丁(Robert C.Martin)于 1996 年在 C++ Report 上发表的文章。 依赖倒置原则的原始定义为:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象(High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions)。其核心思想是:要面向接口编程,不要面向实现编程。 依赖倒置原则是实现开闭原则的重要途径之一,它降低了客户与实现模块之间的耦合。 由于在软件设计中,细节具有多变性,而抽象层则相对稳定,因此以抽象为基础搭建起来的架构要比以细节为基础搭建起来的架构要稳定得多。这里的抽象指的是接口或者抽象类,而细节是指具体的实现类。 使用接口或者抽象类的目的是制定好规范和契约,而不去涉及任何具体的操作,把展现细节的任务交给它们的实现类去完成。 依赖、倒置原则的作用 依赖倒置原则的主要作用如下

面向对象设计原则之依赖倒转原则

假如想象 提交于 2020-02-14 08:09:01
如果说开闭原则是面向对象设计的目标的话,那么依赖倒转原则就是面向对象设计的主要实现机制之一,它是系统抽象化的具体实现。依赖倒转原则是 Robert C. Martin 在 1996 年为“ C++Reporter ”所写的专栏 Engineering Notebook 的第三篇,后来加入到他在 2002 年出版的经典著作“ Agile Software Development, Principles, Patterns, and Practices ”一书中。依赖倒转原则定义如下: 依赖倒转原则 (Dependency Inversion Principle, DIP) :抽象不应该依赖于细节,细节应当依赖于抽象。换言之,要针对接口编程,而不是针对实现编程。 依赖倒转原则要求我们在程序代码中传递参数时或在关联关系中,尽量引用层次高的抽象层类,即使用接口和抽象类进行变量类型声明、参数类型声明、方法返回类型声明,以及数据类型的转换等,而不要用具体类来做这些事情。 为了确保该原则的应用,一个具体类应当只实现接口或抽象类中声明过的方法,而不要给出多余的方法,否则将无法调用到在子类中增加的新方法。 在引入抽象层后,系统将具有很好的灵活性,在程序中尽量使用抽象层进行编程,而将具体类写在配置文件中,这样一来,如果系统行为发生变化,只需要对抽象层进行扩展,并修改配置文件,而无须修改原有系统的源代码

Java基础之final和abstract关键字

纵饮孤独 提交于 2020-02-14 02:09:53
final final在Java中是一个保留的关键字,可以声明成员变量、方法、类以及本地变量。一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编译器会报编译错误。 修饰变量 (例如Math类的PI=3.1415926就是变量不可修改) 用final关键字修饰的成员(实例)变量或局部变量统称为final变量。final变量经常和static关键字一起使用,作为常量。用final关键字修饰的变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改(只读类型);如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。 修饰方法 final关键字可以修饰方法,代表这个方法不可以被子类的方法重写(覆盖)。如果你认为一个方法的功能已经足够完整了,继承它的类中不需要改变的话,你可以声明此方法为final。final方法比非final方法要快,因为在编译的时候已经静态绑定了,不需要在运行时再动态绑定。 关于private和final关键字还有一点联系,这就是类中所有的private方法都隐式地指定为是final的,由于无法在类外使用private方法,所以也就无法覆盖它。 修饰类 当用final修饰一个类时,表明这个类不能被继承。也就是说,如果一个类你永远不会让他被继承,就可以用final进行修饰

模板模式(Template Pattern)

你。 提交于 2020-02-14 01:45:40
模板模式(Template Pattern) 一个抽象类(模板)定义了类中方法的执行方式,子类对模板中的方法进行具体实现,调用的时候以抽象类中的方式进行调用。 目的: 定义一个类中方法的骨架,将特定实现延续到子类中。 主要解决: 一些方法通用,却在每一个子类中都重写了这个方法。 何时使用 :一些通用的方法。 如何解决: 将这些通用算法抽象在模板中。 关键代码: 在抽象类中实现,其他步骤在子类中实现。 使用场景: 多个子类有共同的方法,且逻辑相同;重复复杂的方法。 优点: 封装不需要改变的部分,扩展可以改变的部分;提取公共代码,便于维护;行为由父类控制,(具体)类容由子类实现。 缺点: 每一个不同的子类实现都需要写一个模板的子类,子类个数增加,系统庞大。 注意事项: 防止恶意操作,模板方法一般都加final关键字。 创建抽象类(模板) 1 /** 2 * @author: wooch 3 * @create: 2020/02/14 4 */ 5 public abstract class Game { 6 abstract void initialize(); 7 abstract void startPlay(); 8 abstract void endPlay(); 9 // 模板 10 public final void play(){ 11 // 初始化 12

JAVA学习笔记二

◇◆丶佛笑我妖孽 提交于 2020-02-14 01:16:53
JAVA学习笔记二 五、继承、接口和抽象类 继承extends 父类/基类/超类 parent/base/super 子类/派生类 child/derived 子类不可访问父类private成员 同名方法优先调用子类 单根继承(区别于C++):每个类只能继承一个类 默认继承java.lang.Object(所有类构成类型继承树),Object类默认有clone,equals,finalize,getClass,hashCode,toString等方法 默认super(),只有一个super(),调用父类的构造函数 抽象类和接口 类:属性(0或多个)+方法(0或多个) 一个完整的类:所有的方法都有实现(方法体) 抽象类:暂时有方法未实现 抽象类组成(类名前加abstract class): (optional)成员变量 (optional)具体方法,方法有实现 (optional)抽象方法,加abstract关键字 子类必须实现父类抽象类所有的abstract方法才能成为完整类! 接口类interface:所有方法均未实现 P.s.方法不需要加abstract 一个类只可以继承(extends)一个类,但是可以实现(implements)多个接口,继承和实现可以同时。 P.s.弥补单根继承的不足 接口可以继承多个接口,没有实现的方法将会叠加。 没有全部实现方法,就是抽象类。

玩转PHP中的抽象类与接口

放肆的年华 提交于 2020-02-13 12:33:58
  在面向对象开发中,特别是使用现代化框架的过程中,我们经常会和接口、抽象类打交道。特别是我们自己尝试去封装一些功能时,接口和抽象类往往会是我们开始的第一步,但你真的了解它们吗?   抽象类定义   抽象类的特点:   顾名思义,它是抽象的,当然也就是不能被实例化的。所以,抽象类一般是作为我们的基类来进行定义的。   在一个类中,只要有一个方法被定义为抽象的,那么这个类就必须加上abstract关键字成为抽象类。   被定义为抽象的方法只声明其调用方式,不能定义其具体的功能实现。   子类必须定义父类中的所有抽象方法,这些方法的访问控制必须和父类一致或者更为宽松。   方法的调用方式必须匹配,即类型和所需参数数量必须一致。子类实现的抽象方法可以增加参数但必须有默认值。   abstractclass A {   publicfunction show(){   $this->getName();   echo PHP_EOL;   }   protectedabstractfunction getName();   publicabstractfunction getAge($age);   }   class ChildA1 extends A {   publicfunction getName(){   echo"I'm ChildA1";   }