抽象类

设计模式简介

孤街浪徒 提交于 2020-03-16 00:56:04
设计模式学习记录,基于韩顺平老师的课程 B站视频 链接 设计模式 设计模式(design pattern)是对软件设计中 普遍存在 的(反复出现)的各种问题,所提出的 解决方案 。 设计模式七大原则 单一职责 降低类的复杂度,一个类只负责一项职责 提高类的可读性,可维护性 降低变更引起的风险 通常情况下,我们应当遵守单一职责原则,只有逻辑足够简单,才可以在 代码级 违反单一职责原则;只有类中方法数量足够少,可以在方法级别保持单一职责原则 接口隔离 客户端不应该依赖它不需要的接口,即一个类对另一个类的依赖应该建立在最小的接口上。 依赖倒转(倒置)Dependence Inversion Principle 高层模块不应该依赖低层模块,二者都应该依赖其抽象 抽象不应该依赖细节,细节应该依赖抽象 依赖倒转(倒置)的中心思想是面向接口编程 依赖倒转原则是基于这样的设计理念:相对于细节的多变性,抽象的东西要稳定的多。以抽象为基础搭建的架构比以细节为基础的架构要稳定的多。在java中,抽象指的是接口或抽象类,细节就是具体的实现类 使用接口或抽象类的目的是制定好 规范 ,而不涉及任何具体的操作,把展现细节的任务交给他们的实现类去完成 注意: 低层模块尽量都要有抽象类或接口,或者两者都有,程序稳定性更好 变量的生命类型尽量是抽象类或接口,这样我们的变量引用和实际对象之间就存在一个缓冲层

day-25面向对象

半腔热情 提交于 2020-03-15 11:41:33
继承的另一种使用方式 最常见的是直接继承一个已经存在的类 当你想要创建一个新的类 发现这个类中的一些 在某一个类中已经存在 那就没有必要从头开始写 ,可以直接继承已有的类 然后做补充 注意:当你覆盖了init方法时   不要忘记调用super().init函数让父类完成原有的初始化操作 class MyList(list): def __init__(self,element_cls): # 当你覆盖了init方法时 # 不要忘记调用super().init函数让父类完成原有的初始化操作 super().__init__() self.element_cls = element_cls def append(self, object): # if isinstance(object,str) if object.__class__ == self.element_cls: super().append(object) else: print("只能存储%s类型!" % self.element_cls.__name__) 多继承的问题 python支持多继承 一个类可以同时继承多个父类 好处:是更加灵活 问题:多继承时如果多个父类中出现了同名的属性/函数,属性的查找顺序该怎么确定 办法:需要使用mro列表来查看真正的继承顺序 最后:尽量不要使用多继承 class A: def

Java基础学习 -- 接口

本小妞迷上赌 提交于 2020-03-15 10:27:24
interface是一种特殊的class,但接口的组成比类简单,主要由 抽象方法 (abstract可以省略,但没有方法体)和 全局常量 (public static final)组成。 接口是纯抽象类 所有的成员函数都是抽象函数; 所有的成员变量都是 public static final ; 接口是为了方便类的调用 一个类如果要去 实现 某个接口,要加 implements 接口名 一个类去继承一个接口,必须覆写它的所有方法。 抽象类可以实现接口,但是接口不能继承抽象类。 一个子类可以继承多个接口(这一点秒杀抽象类,一个抽象类只能被一个子类所继承,单继承局限):   interface A { public static final String MSG = "hello"; public abstract void print(); //接口的方法一定为抽象函数,但abstract可以省略。 } interface B { public abstract void fun(); //abstract可以省略。 } class X implements A,B { public void print() { System.out.println("Hi"); } public void fun () { System.out.println(MSG); } public

简单工厂模式小结

╄→гoц情女王★ 提交于 2020-03-14 14:41:44
直觉地使用计算机机能理解的面向过程的方式去解决问题,会出现耦合的问题,是一种短期的方案,使得程序不容易维护与拓展。所以应该将面向对象的思想应用到程序设计当中,通过封装、继承、多态将程序的耦合度降低,运用设计模式增强程序的灵活性,使得它易于修改与复用。为了培养更好的编程思维与习惯,先从设计模式的学习与使用开始,希望有计划地学习设计模式,并且逐渐从了解到化为内用嘤嘤嘤!一、简单工厂模式:创建一个专门的类,使它根据情况创建不同类的对象,实现业务逻辑与界面逻辑的分离,降低耦合。 二、以实现简单计算器为例:创建基础运算抽象类继承抽象类,实现抽象类中的具体运算方法创建简单工厂类,由简单工厂类根据情况选定运算方法,即选定需要创建的类对象。 abstract class Operation{ private double numberA=0; private double numberB=0; public double getNumberA() { return numberA; } public void setNumberA(double numberA) { this.numberA = numberA; } public double getNumberB() { return numberB; } public void setNumberB(double numberB) {

接口和抽象类

柔情痞子 提交于 2020-03-14 08:30:14
什么是接口? 接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现,CLR允许接口可以包含事件、属性、索引器、静态方法、静态字段、静态构造函数以及常数。但是注意:C#中不能包含任何静态成员。一个类可以实现多个接口,当一个类继承某个接口时,它不仅要实现该接口定义的所有方法,还要实现该接口从其他接口中继承的所有方法。 什么是抽象类? 抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此对抽象类不能使用new关键字,也不能被密封。如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类。另外,实现抽象方法由overriding方法来实现。 相同点 都不能被直接实例化,都可以通过继承实现其抽象方法。 都是面向抽象编程的技术基础,实现了诸多的设计模式。 不同点 接口支持多继承;抽象类不能实现多继承。 接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。 接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。 接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。 接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。 接口可以作用于值类型和引用类型

面向对象之接口、抽象类、多态、异常处理、反射、断言

自作多情 提交于 2020-03-13 00:43:03
复习 '''继承​1.父类:在类后()中写父类们class A:passclass B:passclass C(A, B):pass​2.属性查找顺序:自己 -> ()左侧的父类 -> 依次往右类推​3.抽离:先定义子类,由子类的共性抽离出父类 - 派生:父类已经创建,通过父类再去派生子类​4.继承关系 -- 1)父类的所有非封装的属性和方法均能被继承 -- 2)父类的所有封装的属性和方法均能被继承 -- 3)在子类中要去使用父类的方法 -- 子类继承父类方法:子类不需要去实现父类的方法,子类对象可以直接调用父类方法 -- 重写父类的方法:方法名与父类相同,实现体与父类不同,子类对象调用的是自身方法 -- 重用父类的方法:方法名与父类相同,实现体中有自己的逻辑也调用了父类的方法(super()) -- super():在子类中获取可以调用父类方法的对象,且在父类中体现的调用者子类或子类对象 5.复杂继承:一个类可以继承多个类,查找顺序是根据继承父类从左往右的顺序,并且在查找第一个父类时,将父类的父类也进行查找(一个父类分支全部查找完毕才去查找下一个父类分支) ​6.棱形继承 -- 经典类:py2中类不默认继承object,所以没有明确继承的类就没有继承任何类,这样的类称之为经典类 -- 新式类:所有直接或间接继承object的类,py2中主动继承object的类及py3中所有的类

浅谈对OOP的理解

坚强是说给别人听的谎言 提交于 2020-03-13 00:41:09
1.谈谈你对OOP的理解? OOP是面向对象编程,特征分别是封装、继承、多态、抽象。 封装:封装是指将对象信息状态通过访问权限修饰符隐藏在对象内部,不允许外部程序直接访问,如果外部程序要访问对象内部,可以调用内部提供的get或set方法。简单来说,封装就是要找出某一类事务的公性然后提取出来。 继承:子类继承了父类所有的成员方法和属性,并且可以拥有自己特性。继承解决了代码的重用问题 多态:多态存在的三个条件1.继承2.重写3.父类引用指向子类对象 多态的实现方式1.接口实现,继承父类方法重写,同一个类中进行重载 重载:多个同名函数同时存在,具有不同的参数个数/类型,返回值类型可以相同可 以不同,调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这就是多态性,存在于父类和子类、同类中 重写:1.参数列表必须完全与被重写的方法相同 2.返回的类型必须一直与被重写的方法的返回类型相同 3.访问修饰符的限制一定要大于被重写方法的访问修饰符 4.重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常 5.存在于父类和子类之间,方法被定义为final不能被重写。 抽象:如果一个类含有抽象方法,则称这个类为抽象类,抽象类必须在类前用abstract关键字修饰。因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。

JavaSE 学习笔记之继承(五)

一个人想着一个人 提交于 2020-03-12 19:00:43
继 承 (面向对象特征之一) 好处: 1 :提高了代码的复用性。 2 :让类与类之间产生了关系,提供了另一个特征多态的前提。 父类的由来:其实是由多个类不断向上抽取共性内容而来的。 java中对于继承, java只支持单继承。 java虽然不直接支持多继承,但是保留了这种多继承机制,进行改良。 单继承:一个类只能有一个父类。 多继承:一个类可以有多个父类。 为什么不支持多继承呢? 因为当一个类同时继承两个父类时,两个父类中有相同的功能,那么子类对象调用该功能时,运行哪一个呢?因为父类中的方法中存在方法体。 但是 java支持多重继承。 A继承 B B继承 C C继承 D。 多重继承的出现,就有了继承体系。体系中的顶层父类是通过不断向上抽取而来的。它里面定义的该体系最基本最共性内容的功能。 所以,一个体系要想被使用,直接查阅该系统中的父类的功能即可知道该体系的基本用法。那么想要使用一个体系时,需要建立对象。建议建立最子类对象,因为最子类不仅可以使用父类中的功能。还可以使用子类特有的一些功能。 简单说:对于一个继承体系的使用,查阅顶层父类中的内容,创建最底层子类的对象。 子父类出现后,类中的成员都有了哪些特点: 1 :成员变量。 当子父类中出现一样的属性时,子类类型的对象,调用该属性,值是子类的属性值。 如果想要调用父类中的属性值,需要使用一个关键字: super This :

设计模式的征途—8.桥接(Bridge)模式

醉酒当歌 提交于 2020-03-12 06:19:44
在现实生活中,我们常常会用到两种或多种类型的笔,比如毛笔和蜡笔。假设我们需要大、中、小三种类型的画笔来绘制12中不同的颜色,如果我们使用蜡笔,需要准备3*12=36支。但如果使用毛笔的话,只需要提供3种型号的毛笔,外加12个颜料盒即可,涉及的对象个数仅为3+12=15,远远小于36却能实现与36支蜡笔同样的功能。如果需要新增一种画笔,并且同样需要12种颜色,那么蜡笔需要增加12支,而毛笔却只需要新增1支。通过分析,在蜡笔中,颜色和型号两个不同的变化维度耦合在一起,无论对其中任何一个维度进行扩展,都势必会影响另外一个维度。但在毛笔中,颜色和型号实现了分离,增加新的颜色或者型号都对另外一方没有任何影响。在软件系统中,有些类型由于自身的逻辑,它具有两个或多个维度的变化。为了解决这种多维度变化,又不引入复杂度,这就要使用今天介绍的Bridge桥接模式。 桥接模式(Bridge) 学习难度:★★★☆☆ 使用频率:★★★☆☆ 一、跨平台的图像浏览系统 1.1 需求介绍 M公司开发部想要开发一个跨平台的图像浏览系统,要求该系统能够显示JPG、BMP、GIF、PNG等多种格式的文件,并且能够在Windows、Linux以及Unix等多个操作系统上运行。该系统首先将各种格式的文件解析为像素矩阵(Matrix),然后将像素矩阵显示在屏幕上,在不同的操作系统中可以调用不同的绘制函数来绘制像素矩阵

学习java第一天总结

点点圈 提交于 2020-03-11 23:46:16
一,java注重大小写,一个源文件中只能(并非必须要有)有一个publick类,这个public类的类名字一定要和文件名是一样的。其中类名首字母要求均大写,而成员变量,局部变量,和静态类内变量都要求单词首字母小写后面单词的首字母要大写,而类方法要求为小写。 二,类型方面, 有六个数字类型(整型:byte(8),short(16),int(32),long(64),浮点型:float(32),double(64))都是有符号的,char为一个16位的字符,使用unicode,boolead类型只有两种结果,默认为false,这样就总共有8种内置基本类型,这些基本类型定义于java.lang中。 另外java还提供引用类型。初始化float时必须加后缀f,初始化double必须加后缀d或D。数组和对象都是引用类型,所有引用类型默认值为null,数组是存放在堆上的。 还有一个void类型 三,关于变量,只有局部变量,类内成员变量,类内静态变量。其中局部变量是没有默认值的,使用时必须要初始化,未初始化无法编译,同时如果只声明,不使用并不会报错。另外两种变量有默认值,都可以在声明或类构造方法中初始化,其中类内静态变量还可以在静态语句块中初始化。对比c++,少了全局变量,静态函数内变量,文件内局部变量。同时java也没有全局函数的概念,一切均在类中。 类内静态变量可以使用classname