项目7 面向对象高级.

Slides:



Advertisements
Similar presentations
软件编程基础 一、程序的编辑 Java 源程序是以 Java 为后缀的简单的文本文件,可以用各种 Java 集成开发环境中的源代码编辑器来编写,也可以用其他文 本编辑工具,如 Windows 中的记事本或 DOS 中的 EDIT 软件等。 利用文字编辑器编写下列程序 public class Hello.
Advertisements

第四章 类、对象和接口.
第三讲 面向对象(上).
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
JAVA 编 程 技 术 主编 贾振华 2010年1月.
项目6 通用堆栈.
四資二甲 第三週作業 物件導向程式設計.
项目:贪吃蛇游戏设计 工作任务一:系统设计(system design) 工作任务二:豆类(Bean)设计
设计模式可以帮助我们改善系统的设计,增强 系统的健壮性、可扩展性,为以后铺平道路。
C#程序设计 10软件1、2班 王槐彬 计算机工程学院.
第二章 JAVA语言基础.
類別與物件 Class & Object.
Ch07 介面與多重繼承 物件導向程式設計(II).
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
Ch08 巢狀類別 物件導向程式設計(II).
第5章 异常处理 王德俊 上海交通大学继续教育学院.
Go语言就业指南 岳东卫 技术总监 讲师的CSDN博客地址
C#程序设计 c# programming 泛型 C#程序设计课程组.
第八章 C#高级编程.
第四章 在 C# 中实现 OOP 概念.
Classes Lecturer: 曾學文.
程序與函數的類別方法 目的:模組化程式設計 方法:由上而下設計 注意事項:(1)獨立性 (2)結合問題 (3)子問題間的溝通.
第六章 类的扩展与继承.
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
第三章 C#面向对象初级编程 面向对象得程序设计越来越受到编程人员的喜爱。类和对象是面向对象程序设计中的重要概念。封装性、继承性和多态性是面向对象的特点,本章旨在全面说明C#编写面向对象程序设计的方法。
程式設計實作.
C++ with Managed Extensions
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
C#程序设计基础 $3 成员、变量和常量.
第9章 多线程 王德俊 上海交通大学继续教育学院.
Java程序设计 第9章 继承和多态.
Ch01 物件與類別複習 物件導向系統實務.
C#面向对象程序设计 $7 继承和多态性.
類別的繼承 Vehicle Car.
SPOTO TM JAVA课程 JAVA中的OO语法
中国矿大计算机学院杨东平 第5章 接口和包 中国矿大计算机学院杨东平
第6章 继承和接口设计 6.1 继 承 6.2 多态性 6.3 抽象类 6.4 接口 6.5 接口在集合排序中的应用.
第9讲 Java的继承与多态(一) 类的继承 子类的创建 方法覆盖.
2019/1/16 Java语言程序设计-类与对象 教师:段鹏飞.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
C/C++/Java 哪些值不是头等程序对象
C#程序设计基础 第二章 数据类型.
第六章 属性、索引器、委托和事件.
* 單元:電腦與問題解決 主題:Java物件導向程式設計-類別與物件 台南縣國立善化高中 蕭嘉民 老師
第16章 虛擬與多形 16-1 虛擬函數 16-2 純虛擬函數與抽象類別 16-3 多形 16-4 虛擬繼承與虛擬解構子.
第三章 C# 基础知识.
第7章 繼承/多型/介面 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
辅导课程八.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
C#程序设计基础 $3 成员、变量和常量.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
龍老師我不會Debug QQ.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
05 方法. 05 方法 5.1 方法 在一個較大型的程式中,通常會將具有特定功能或經常重複使用的程式,撰寫成獨立的小單元,稱為「方法」(Method),並賦予方法一個名稱,當程式需要時就可以呼叫此方法來執行該段特定程式。(此種重複使用的程式小單元在其他語言中可能稱為程序、副程式或函式, Visual.
判斷(選擇性敘述) if if else else if 條件運算子.
第二章 Java基础语法 北京传智播客教育
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第二章 Java基本语法 讲师:复凡.
第6章 继承和多态 伍孝金
Summary
Presentation transcript:

项目7 面向对象高级

C# 程序设计 项目1 :认知.NET与 C# 项目2 :数据运算 项目3 :程序流程控制 项目4 :收集同一类型数据 项目5 :堆积木——方法 项目6 :面向对象基础 项目7 :面向对象高级 项目8:调试程序和异常处理 项目9:开发 Windows 窗体应用程序 项目10:开发图形应用程序 项目11:文件流操作 项目12: 数据库访问——ADO.NET 2

目标 本章学习目标: 理解并使用继承 理解并使用多态性 理解重写的概念 理解接口的概念

项目7 面向对象高级 继承性 多态性 接口 小结 实验 习题

继承性 继承是指派生类可以获得其基类(此基类本身也可以是派生类)特征的能力。继承允许把行为的公共集合(定义为属性和方法)包含在基类中,这些公共集合可以在基类的派生类中得到重用。利用继承性,可以以现有的通用类型为基础,创建出新的特殊类型。

继承示例 继承的层次结构示例 动物 基类 老鼠 猫 派生类

继承性 (续) 继承性: 优点:继承最主要的优点就是代码重用 继承的传递性:如果C 从B 中派生,B 又从A 中派生,那么C 不仅继承了B 中声明的成员,同样也继承了A 中的成员 继承的单一性:派生类只能继承单个基类 7

继承性 (续) 派生类 在派生类中调用基类构造函数 密封类 8

派生类 创建派生类的语法如下: [访问修饰符] class 派生类类名 : 基类类名 { //派生类成员定义 } 9

继承示例 继承而来 基类 派生类 class Animal { // 成员字段 protected int eyes, nose; public Animal() eyes = 2; nose = 1; } protected void Eat() // 定义 class Dog : Animal { // 成员字段、方法 public void Barking() // 定义 } public void Wagging_Tail() static void Main() //定义 Static void Main() { Dog d = new Dog() ; d.Eat(); } 继承而来

派生类(续) 访问修饰符“protected”可以将类成员的作用域限制在本类及其派生类中。 Protected 访问修饰符 11

在派生类中调用基类构造函数 执行顺序 因为派生类要使用基类,所以基类实例化必须在派生类实例化之前进行。 调用特定的构造函数 如果想要调用基类的非默认构造函数,那么必须使用 base 关键字。 12

构造函数示例 public class Animal { public Animal() Console.WriteLine("Constructing Animal"); } static void Main(string[] args) { Mouse m = new Mouse(); } public class Mouse : Animal { public Mouse() //先调用基类的构造函数 Console.WriteLine("Constructing Mouse"); } ...

base示例 public class Animal { public Animal(string color) Console.WriteLine(color + " Animal"); } static void Main(string[] args) { Mouse m = new Mouse("White"); } public class Mouse : Animal { public Mouse(string color) : base(color) //调用基类的构造函数 Console.WriteLine(color + " Mouse"); } ...

密封类 在 C# 中,有一种类称为密封类。当把某个类声明为密封类时,编译器将禁止所有类继承该类。 一般情况下,类是不“密封的”,因为一旦把某个类声明为密封类,这个类将永远不能再扩展了。但是,如果某个类具有特殊的实现,并且不允许其他任何类继承该类,那么就需要把此类声明为密封类。 15

隐藏成员 派生类如果定义了与继承而来的成员同名的新成员,就可以隐藏已继承的成员,但这并不因为这派生类删除了这些成员,只是不能再访问这些成员而已。这时,编译器不会报错,而是一个警告。通过在派生类同名成员前面使用new关键字,可以明确的告知编译器,我的确是故意覆盖父类的成员。 派生类如果声明了与基类同名的成员,但成员方法的参数不同,此时称派生类成员对基类成员的重载。

new示例 public class Animal { public void Eat() Console.WriteLine("Eating"); } public class Mouse : Animal { new public void Eat() //使用new关键字 Console.WriteLine("Eating cheese"); } static void Main(string[] args) { Mouse m = new Mouse(); m.Eat(); }

方法重载示例 public class Animal { public void Eat() Console.WriteLine("Eating"); } public class Mouse : Animal { public void Eat(string food) //方法参数列表不同,重载 Console.WriteLine("Eating " + food); } static void Main(string[] args) { Mouse m = new Mouse(); m.Eat(); //调用基类的Eat()方法 m.Eat("cheese"); //调用派生类的Eat()方法 }

项目7 面向对象高级 继承性 多态性 接口 小结 实验 习题 19

多态性——青蛙和蝌蚪 多态性是一个面向对象的概念,同一操作作用于不同的类的实例,不同的类将进行不同的解释,最后产生不同的执行结果。 20

多态性(续) 编写虚方法 抽象方法和抽象类 21

编写虚方法 virtual 关键字 override 关键字 调用虚方法 在派生类中调用基类成员 22

virtual 关键字 如果基类中的方法,需要在派生类中进行重写,那么必须在基类的方法声明的时候,将方法声明为虚方法,虚方法的定义要用到virtual关键字 ,如下所示: public class Animal { public virtual void Eat() { Console.WriteLine(″Eat something″); } 这样,Animal 类的任何派生类都可以实现新的 Eat() 方法。 如果基类中的方法,需要在派生类中进行重写,那么必须在基类的方法声明的时候,将方法声明为虚方法,在派生类中,明确的告知编译器进行重写。 23

override 关键字 如果在派生类中要重写基类方法,那么需要使用 override 关键字,如下所示: public class Cat : Animal { public override void Eat() { Console.WriteLine(″Eat Mouse″); } 24

调用虚方法 通过使用多态性,可以采用一种通用的方式来处理派生类,可以认为派生类对象的类型都是基类类型。 运行时多态的经典用法: Father f=new Son(); f.Work();//将调用Son的Work方法

派生类中调用基类成员示例 public class Animal { public virtual void Move() Console.WriteLine(“Move"); } static void Main(string[] args) { Fish f = new Fish(); f.Move(); } public class Fish : Animal { public override void Move() base.Move(); Console.WriteLine(“Swim”); }

抽象方法和抽象类 当创建一个类时,有时需要让该类包含一些特殊的方法,该类对这些方法不提供实现,但是该类的派生类必须实现这些方法,这些方法称为抽象方法。抽象方法是没有被实现的空方法。 包含抽象成员的类称为抽象类,但是,并不要求抽象类都包含抽象成员。包含抽象成员的类一定是抽象类。抽象类可以包含非抽象成员。 抽象类是用来作为基类的,抽象类不能直接实例化,而且也不能被密封。 27

抽象方法和抽象类 语法 优点 重写 具有虚方法的抽象类 抽象属性 28

语法 抽象方法和抽象类的声明使用abstract 修饰符: 下列代码创建了一个具有抽象Eat()方法的Animal抽象类: [访问修饰符] abstract class 类名 { //... } [访问修饰符] abstract 返回值类型 方法名 ([参数]) ; 下列代码创建了一个具有抽象Eat()方法的Animal抽象类: public abstract class Animal{ public abstract void Eat(); } 29

优点 抽象方法的优点在于基类无需对抽象方法提供实现,但是基类的派生类必须为基类中的抽象方法提供实现。 30

重写 当派生类从抽象类中继承一个抽象方法时,派生类必须重写该抽象方法。这个规则在编译时强制实施。 public class Mouse : Animal { public override void Eat () { Console.WriteLine(“Eat cheese”); } 31

具有虚方法的抽象类 public abstract class Animal { public virtual void Sleep() //虚方法 Console.WriteLine(“sleeping”); } public abstract void Eat(); } 如果有一个通用方法,该方法对所有派生类来说是公共的,并且强制要求所有派生类都必须实现这个方法,那么必须把该方法定义为基类中的抽象方法。 32

抽象属性 在声明抽象属性时,需要指定属性名和派生属性应该实现的访问函数。下面的代码创建了一个 Animal 类,并且声明了一个名为 IsHungry 的抽象属性: public abstract class Animal { public abstract bool IsHungry{get; set;} } 若要把该属性声明为只读属性或只写属性,可以移除相应的访问器。 33

项目7 面向对象高级应用 继承性 多态性 接口 小结 实验 习题 34

接口 什么是接口 接口的使用方法 如何使用实现了某接口的对象 如何继承多个接口 接口与抽象类的比较 35

定义 在某种程度上,接口像一个抽象类,可以定义接口的成员,但是,接口不提供接口成员的实现。 继承接口的类必须提供接口成员的实现。 成员包括:方法、属性、索引器、事件。 36

接口的使用方法 声明接口 实现接口 37

声明接口 声明接口要使用 interface 关键字,语法如下: [访问修饰符] interface <接口名> { public protected internal private 接口名称一般都会以大写的I开头,表示为接口类型。 声明接口要使用 interface 关键字,语法如下: [访问修饰符] interface <接口名> { //接口成员 } 接口的成员可以是 方法 属性 索引器 事件 interface IAnimal { bool IsHungry { get; set; } void Hunt(); } 定义了一个IAnimal接口,该接口具有一个Hunt()方法和一个IsHungry属性。 38

声明接口 接口的成员必须是方法、属性、事件或索引器。 接口不能包含常量、字段、运算符、构造函数、析构函数,也不能包含任何种类的静态成员。 所有接口成员都隐式地具有public访问属性。 接口成员声明中包含任何修饰符都属于编译时错误。

实现接口 要实现一个接口,必须要有类继承该接口。 接口的实现类可以是派生类,并且这些派生类可以包括一些自己特有的类成员。 40

示例代码 public class Lion : IAnimal static void Main(string [] args) { { private bool hungry; public bool IsHungry get { return hungry; } set { hungry = value; } } public void Hunt() Console.WriteLine(“Lion is hunting little animal"); static void Main(string [] args) { Lion l = new Lion(); l. IsHungry = true; l. Hunt(); }

继承多个接口 若要实现多接口继承,则需要列出这些接口,这些接口之间用逗号分开,如下所示: class Chimpanzee: Animal, ICarnivore, IHerbivore { … } 继承接口的类必须实现所有接口的所有成员。 42

接口与抽象类的比较 与抽象类不同的是,接口是一个完全抽象的成员集,这个成员集为相关操作定义了一组规则。接口的实现完全留给了开发者。 抽象类为管理组件版本提供了一种简单易行的方法。通过更新基类,所有派生类都将自动进行相应更新。而接口在创建后就不能再更改。如果需要修改接口,则必须创建新接口。 43

接口与抽象类的比较 当准备为组件提供多态性时,表 中的建议将有助于在抽象类和接口之间做出正确的选择。 目标 选择 创建多个组件版本 抽象类 设计小而简练的功能块 接口 设计大型功能单元 44

项目7 面向对象高级应用 继承性 多态性 接口 小结 实验 习题 45

小结 本章继续上一章面向对象的内容更进一步阐述了面向对象的重要概念—继承和多态性。 面向对象的继承原则允许创建一个基类,然后从这个基类派生出更多的派生类,其中派生类能够继承基类的属性和方法。 46

项目7 面向对象高级应用 继承性 多态性 接口 小结 实验 习题 47

实验 参照实验手册,并在教师指导下完成实验报告。 48

项目7 面向对象高级应用 继承性 多态性 接口 小结 实验 习题 49

习题 1. 填空题 (1) 将一个基类对象当做_________对象可能引发错误。 1. 填空题 (1) 将一个基类对象当做_________对象可能引发错误。 (2) 如果一个类包含一个或多个抽象方法,它是一个_________类。 (3) 使用关键字_________声明的类不能被继承。 (4) 使用关键字_________声明抽象类。 (5) 多态性包括使用基类的引用来操纵一个__________对象。

习题(续) 2. 判断正误,如果错误,请说明原因。 (1) 抽象类中所有的方法必须被声明为abstract。 2. 判断正误,如果错误,请说明原因。 (1) 抽象类中所有的方法必须被声明为abstract。 (2) 具有抽象方法的类必须声明为abstract。 (3) 多态性允许程序员使用基类的引用管理派生类。 (4) 声明为abstract类的方法必须同时进行声明和实现。 51

习题(续) 3. 程序改错 阅读下面的程序,找出其中错误并改正过来:using system class Triangle { 6.6 习题 3. 程序改错 阅读下面的程序,找出其中错误并改正过来:using system class Triangle { private int a; private int b; private int c; public Triangle(int va, int vb,int vc){ a=va; b=vb; c=vc; } 52

习题(续) public void Main(){ Triangle tr = new Triangle(2,2); 6.6 习题 public void Main(){ Triangle tr = new Triangle(2,2); Console.WriteLine(“{0},{1}”,tr.a,tr.b); return 0; } 53