多态

[面向对象学习笔记] 封装、抽象、继承、多态分别可以解决那些编程问题

不羁岁月 提交于 2019-12-23 18:17:00
封装 是什么封装 封装也叫作信息隐藏或者数据访问保护。类通过暴露有限的访问接口,授权外部仅能通过类提供的方法来访问内部信息或者数据。例如在Java中我们在定义一个类时,会给一个类加属性,我们给将这些类属性设置为private,然后给这些属性添加一些方法,有的只能被获取,不能被修改,有些可以被修改,但是不可以被重置。在Java中是通过一些关键字来提供访问权限控制。如果Java中没有提供这些关键词,所有的属性默认都是public的,那么外部的代码都可以随意的更改对象中属性的值,这样是无法达到隐藏信息和保护数据的目的,也就是无法支持封装特性。 封装的意义 如果我们对类中属性的访问不加以控制,那任何代码都以访问、修改类中的属性,虽然这样看起来更加灵活,但是灵活以为着不可控,属性可以随意被修改,修改的逻辑可能散落在哥哥角落,势必会影响代码的可读性、可维护性。 除此之外,类通过有效的方法暴露必要的操作,也能提高类的易用性。我们把属性封装起来,暴露少许的几个不要的方法给调用者,调用者就不需要了解太多背后的业务细节,用错的概率就减少很多。 抽象 什么是抽象 在面向对象编程中,我们常借助编程语言提供的接口类或者抽象类这两种语法机制,来实现抽象这一特性。例如:在Java中,是通过interface和abstract关键字语法来实现。这种抽象是指把一些类的公共行为抽象到更高的层次。

多态!

本秂侑毒 提交于 2019-12-23 10:41:20
让我们看一个金融期权的类型AmOption,如图1所示。 +-------------------------------------------------------+ | Deal iceable | | ^ ^ | | | | | | +------------------------------+ | | | Option | | | +------------------------------+ | | ^ ^ | | | | | | AmOption EurOption | +------------------------------------------------------------------+ 图1 在一个金融期权层次结构中多态的作用。AmOption有4种类型 AmOption对象同时具有四种类型:AmOption\Option\Deal\Priceable。由于一个类 型是一组操作,因此,AmOption对象通过其4个接口中的任何一个进行操纵。这意味着一 个AmOption对象可以被针对Deal\Priceable\Option接口编写的代码所操纵,从而允许 AmOption的实现利用或复用所有那些代码。对于AmOption这样的多态类型,从基类继承 的最重要的东西就是他的接口,而不是他的实现。事实上,一个基类仅仅由接口组成不 但常见

GRASP 通用职责分配软件设计模式 (原则)

只谈情不闲聊 提交于 2019-12-22 19:21:06
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> GRASP ,全称为 General Responsibility Assignment Software Pattern ,即 通用职责分配软件模式 ,它由《 UML 和模式应用》 ( Applying UML and Patterns ) 一书作者 Craig Larman 提出。与其将它们称之为设计模式,不如称之为设计原则,因为它是站在面向对象设计的角度,告诉我们 怎样设计问题空间中的类与分配它们的行为职责,以及明确类之间的相互关系等 ,而不像 GoF 模式一样是针对特定问题而提出的解决方案。因此 GRASP 站在一个更高的角度来看待面向对象软件的设计,它是 GoF 设计模式的基础。 GRASP 是 对象职责分配 的基本原则,其核心思想是 职责分配 (Responsibility Assignment) ,用职责设计对象 (Designing Objects with Responsibilities) 。 它包含如下 9 个基本模式: 1. 信息专家模式 (Information Expert Pattern) (1) 问题: 给对象分配职责的通用原则是什么? (2) 解决方案: 将职责分配给拥有履行一个职责所必需信息的类,即信息专家。 (3) 分析: 信息专家模式是面向对象设计的最基本原则。通俗点来讲

面向对象范式的核心本质是?---不是继承 不是封装也不是多态

独自空忆成欢 提交于 2019-12-22 11:30:47
核心本质 你可能会说 其核心本质 是类似万物皆为对象 的一种设计思想,又或者说是 封装继承多态的运用,又或者是其他的什么. 我觉得,这些说法也对,不过今天要说的是另一个概念: 依赖反转. 用了个标题党的标题,答案就开门见山一些。 其核心本质,乃是通过安全便且捷的多态实现的 依赖反转;及 由此带来的依赖关系的灵活性,以及 系统架构的灵活性。 什么是依赖反转 用一张图说明下,如下: 图中,class1 要调用 class2 的函数, 依赖反转 是通过接口实现多态,进而实现依赖反转。 如果interf2没有这个接口,即图中 蓝色线条的情况。那么classe1 直接调用 class2,那么依赖方向 和控制流方向 是一致 的,都是由 class1 到 class2. 如果有 interface2 这个接口, class2 实现了 interface2, class1调用interface2; 此时的依赖方向 就是 变成了 class2,依赖 interface2. 而这个 依赖方向和控制流的方向是相反的, 这个相反就叫做依赖反转 为什么不是 封装 继承 多态 至于为什么面向对象的核心特质 不是面向对象的三大特质,原因也很简单, 在面向对象语言出现之前,封装、继承、多态这样概念和 做法已经出现了。甚至有些地方比面向对象语言的设计更为严格。 关于封装,如果用C语言去实现封装

C# 多态理论基础

[亡魂溺海] 提交于 2019-12-22 01:02:53
一、概述 同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。 可以用不同的方式实现组件中的多态性: ● 接口多态性。 ● 继承多态性。 ● 通过抽象类实现的多态性。 二、实现 2.1、虚方法 定义:当类中的方法声明前加上 virtual 修饰符,则称之为虚方法。 作用:子类可以对父类中的虚方法进行重写,虚方法是多态特性的一种体现。 即,用 virtual 关键字修饰父类方法,用 override 关键字修饰子类方法,实现了方法重写。 特点: a)、使用了 virtual 修饰符后不允许再有 static 、 abstract 或 override 修饰符 b)、父类方法的访问级别和子类重写方法的的访问级别必须相同,即它们应该具有相同的访问修饰符 2.2、抽象类和抽象方法 描述:如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个基类,这样的类就是抽象类,在抽象类中声明方法时,如果加上abstract时就是抽象方法。 抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。 抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。 2.2.1

C++多态性与虚函数

情到浓时终转凉″ 提交于 2019-12-22 00:51:33
  派生一个类的原因并非总是为了继承或是添加新的成员,有时是为了重新定义基类的成员,使得基类成员“获得新生”。面向对象的程序设计真正的力量不仅仅是继承,而且还在于允许派生类对象像基类对象一样处理,其核心机制就是多态和动态联编。 (一)多态性   多态是指同样的消息被不同的对象接收时导致不同的行为。所谓消息是指对类成员函数的调用,不同的行为是指的不同的实现,也就是调用了不同的函数。 1)多态的分类   广义上说,多态性是指一段程序能够处理多种类型对象的能力。在C++中,这种多态性可以通过重载多态(函数和运算符重载),强制重载(类型强制转换),类型参数化多态(模板) ,包含多态(继承与虚函数)四种方式来实现。类型参数化多态和包含多态称为一般多态性,是用来系统地刻画语义上相关的一组类型;重载多态和强制多态性称为特殊多态性,用来刻画语义上无关连的类型间关系。   C++中采用虚函数实现包含多态。虚函数为C++提供了更为灵活的多态机制,这种多态性在程序运行时才能够确定,因此虚函数是多态性的精华,至少含有一个虚函数的类称为多态类。包含多态在面向对象的程序设计中使用很频繁。 2)静态联编   联编又称为绑定,就是将模块或函数合并在一起生成可执行代码的处理过程,同时对每个模块或函数分配内存地址,对外部访问也提供正确的内存地址。   在编译阶段就将函数实现与函数调用绑定起来称为静态联编

依赖注入那些事儿

烈酒焚心 提交于 2019-12-21 23:52:06
目录 目录 1 IGame游戏公司的故事 1.1 讨论会 1.2 实习生小李的实现方法 1.3 架构师的建议 1.4 小李的小结 2 探究依赖注入 2.1 故事的启迪 2.2 正式定义依赖注入 3 依赖注入那些事儿 3.1 依赖注入的类别 3.1.1 Setter注入 3.1.2 Construtor注入 3.1.3 依赖获取 3.2 反射与依赖注入 3.3 多态的活性与依赖注入 3.3.1 多态性的活性 3.3.2 不同活性多态性依赖注入的选择 4 IoC Container 4.1 IoC Container出现的必然性 4.2 IoC Container的分类 4.2.1 重量级IoC Container 4.2.2 轻量级IoC Container 4.3 .NET平台上典型IoC Container推介 4.3.1 Spring.NET 4.3.2 Unity 参考文献 1 IGame游戏公司的故事 1.1 讨论会 话说有一个叫IGame的游戏公司,正在开发一款ARPG游戏(动作&角色扮演类游戏,如魔兽世界、梦幻西游这一类的游戏)。一般这类游戏都有一个基本的功能,就是打怪(玩家攻击怪物,借此获得经验、虚拟货币和虚拟装备),并且根据玩家角色所装备的武器不同,攻击效果也不同。这天,IGame公司的开发小组正在开会对打怪功能中的某一个功能点如何实现进行讨论

多态和抽象类

↘锁芯ラ 提交于 2019-12-21 15:33:47
多态 1.要实现多态,那么必须存在父子关系(继承关系或者实现接口) 2.实现多态的方式:将父类对象的声明指向子类对象,例如Pet pet = new Dog(); 例如: /* 这是一个类名为Pet的父类 */ public class Pet { public void print ( ) { System . out . println ( "----调用Pet父类的print方法-----" ) ; } } /* 这是类名为Dog的第一个子类 */ public class Dog extends Pet { public void print ( ) { System . out . println ( "-----调用Dog子类的print方法-----" ) ; } } /* 这是类名为Cat的第二个子类 */ public class Cat extends Pet { public void print ( ) { System . out . println ( "-----调用Cat子类的print方法----" ) ; } } /* 这是类名为Test的测试类 */ public class Test { public static void main ( String [ ] args ) { Dog dog = new Dog ( ) ; dog .

C++中的虚函数和纯虚函数用法

旧时模样 提交于 2019-12-21 10:53:17
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1. 虚函数和纯虚函数可以定义在同一个类(class)中,含有纯虚函数的类被称为抽象类(abstract class),而只含有虚函数的类(class)不能被称为抽象类(abstract class)。 2. 虚函数可以被直接使用,也可以被子类(sub class)重载以后以多态的形式调用,而纯虚函数必须在子类(sub class)中实现该函数才可以使用,因为纯虚函数在基类(base class) 只有声明而没有定义。 3. 虚函数和纯虚函数都可以在子类(sub class)中被重载,以多态的形式被调用。 4. 虚函数和纯虚函数通常存在于抽象基类(abstract base class -ABC)之中,被继承的子类重载,目的是提供一个统一的接口。 5. 虚函数的定义形式:virtual {method body} 纯虚函数的定义形式:virtual { } = 0; 在虚函数和纯虚函数的定义中不能有static标识符,原因很简单,被static修饰的函数在编译时候要求前期bind,然而虚函数却是动态绑定(run-time bind),而且被两者修饰的函数生命周期(life recycle)也不一样。 6. 如果一个类中含有纯虚函数,那么任何试图对该类进行实例化的语句都将导致错误的产生,因为抽象基类(ABC

C++多态(一)---多态的概念

↘锁芯ラ 提交于 2019-12-21 10:05:29
C++多态 多态概念 通俗来讲,就是一个事物的多种形态 当不同对象完成某种行为时,所表现出来的不同种的状态 称之为多态 多态的定义 在面向对象语言中,对于接口的不同实现方式称之为多态。多态性时允许将父类对象设置成为一个或者多个他的子类对象相等的技术 一般用指针实现 ,赋值之后,父类对象可以根据当前赋值给他的子类对象的特性以不同方式进行调用。 例子 :买票的行为,当普通人进行买票时(调用买票函数时),需要买全价票,当学生进行买票时(依旧调用买票函数),可以买半价票,当军人进行买票时(仍然调用买票函数),可以优先进行买票。 多态的实现 class Person { public : virtual void BuyTicket ( ) //基类买票函数必须为虚函数 { cout << "全价票" << endl ; } } ; class Student : public Person { public : virtual void BuyTicket ( ) //子类需要将基类中的虚函数进行重写 { cout << "半价票" << endl ; } } ; class Soldier : public Person { public : virtual void BuyTicket ( ) { cout << "优先买票" << endl ; } } ; void Func (