C#面向对象程序设计 $7 继承和多态性.

Slides:



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

第三讲 面向对象(上).
JAVA 编 程 技 术 主编 贾振华 2010年1月.
项目7 面向对象高级.
项目6 通用堆栈.
四資二甲 第三週作業 物件導向程式設計.
C#程序设计案例教程 第3章 程 序 结 构.
C#程序设计 10软件1、2班 王槐彬 计算机工程学院.
第二章 JAVA语言基础.
類別與物件 Class & Object.
第15章 繼承與多重繼承 15-1 繼承的基礎 15-2 覆寫與隱藏父類別的成員 15-3 子類別的建構與解構子 15-4 多重繼承
第三章 控制结构.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
Ch08 巢狀類別 物件導向程式設計(II).
程式設計實作.
第5章 异常处理 王德俊 上海交通大学继续教育学院.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
C#程序设计 c# programming 泛型 C#程序设计课程组.
第八章 C#高级编程.
第二章 C# 基础知识.
第四章 在 C# 中实现 OOP 概念.
Classes Lecturer: 曾學文.
第六章 类的扩展与继承.
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
第三章 C#面向对象初级编程 面向对象得程序设计越来越受到编程人员的喜爱。类和对象是面向对象程序设计中的重要概念。封装性、继承性和多态性是面向对象的特点,本章旨在全面说明C#编写面向对象程序设计的方法。
程式設計實作.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
C#程序设计基础 $3 成员、变量和常量.
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
第三章 流程控制與例外處理 資訊教育研究室 製作 注意:本投影片僅供上課使用,非經同意,請勿散播或轉載。
SPOTO TM JAVA课程 JAVA中的OO语法
第6章 继承和接口设计 6.1 继 承 6.2 多态性 6.3 抽象类 6.4 接口 6.5 接口在集合排序中的应用.
例外處理與 物件序列化(Exception Handling and Serialization of Objects)
第9讲 Java的继承与多态(一) 类的继承 子类的创建 方法覆盖.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
C/C++/Java 哪些值不是头等程序对象
C#程序设计基础 第二章 数据类型.
第六章 属性、索引器、委托和事件.
類別與物件 I (Classes and Objects I)
* 單元:電腦與問題解決 主題:Java物件導向程式設計-類別與物件 台南縣國立善化高中 蕭嘉民 老師
第三章 C# 基础知识.
第7章 繼承/多型/介面 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
辅导课程八.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
劉崇汎 崑山科技大學 電腦與通訊系 DLL的建立與引用 劉崇汎 崑山科技大學 電腦與通訊系
C#程序设计基础 $3 成员、变量和常量.
Java程式初體驗大綱 大綱 在學程式之前及本書常用名詞解釋 Hello Java!程式 在Dos下編譯、執行程式
第四章 类 4.1 基础知识 4.2 构造函数 4.3 方法 4.4 属性与索引 4.5 String类
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
第二章 Java语法基础.
第二章 Java基本语法 讲师:复凡.
面向对象技术 练习 ffh.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
目标 流程控制 字符串处理 C# 的类和对象 C# 访问修饰符 C# 构造函数和析构函数.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
C# 匿名委派 + Lambda + Func 建國科技大學 資管系 饒瑞佶.
辅导课程十二.
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
C#快速導讀 流程控制.
第二章 Java基础语法 北京传智播客教育
輸出執行結果到螢幕上 如果要將執行結果的文字和數值都「輸出」到電腦螢幕時,程式要怎麼寫? class 類別名稱 {
第二章 Java基本语法 讲师:复凡.
第6章 继承和多态 伍孝金
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
Summary
Presentation transcript:

C#面向对象程序设计 $7 继承和多态性

继承和多态性 继承

继承 基类和派生类 图形 三角形 四边形 多边形 椭圆形 平行四边形 圆形 菱形 矩形

类的构造方式 自顶向下 自底向上 从基础类型开始向下分解,不断得到新的派生类型。 联系人 -> 亲属、同事、同学 联系人 -> 亲属、同事、同学 自底向上 对现有的一组具体类型进行抽象,得到新的基础类型。 储蓄卡、信用卡、借记卡 -> 银行卡

继承方式构造类 /// <summary> /// 基类:联系人Contact /// </summary> public class Contact { //字段 protected string m_name; protected string m_homePhone = "未知"; protected string m_busiPhone = "未知"; protected string m_mobilePhone = "未知"; //属性 public string Name get { return m_name; } set { m_name = value; } } /// <summary> /// 派生类:商务Business /// </summary> public class Business : Contact { //字段 protected string m_busiFax = "未知"; protected string m_title = "女士/先生"; //属性 public string Title get { return m_title; } set { m_title = value; } }

继承方式构造类(续) /// <summary> /// 派生类:亲属Family /// </summary> public class Family : Contact { //字段 protected string m_relation; protected DateTime m_birthday; //属性 public string Relation get { return m_relation; } set { m_relation = value; } } public DateTime Birthday get { return m_birthday; } set { m_birthday = value; }

继承 基类和派生类 继承基类中的public/protected成员 增加新的成员 覆盖已有的成员(new)

成员覆盖示例 base关键字访问基类成员 //索引函数 public new string this[string phoneType] { get switch (phoneType) case "住宅电话": return m_homePhone; case "办公电话": return m_busiPhone; case "手机": return m_mobilePhone; default: return null; } set { switch (phoneType) case "住宅电话": m_homePhone = value; break; case "办公电话": m_busiPhone = value; case "手机": m_mobilePhone = value; default: } base关键字访问基类成员

继承 对象生命周期 派生类在创建时自顶向下地调用各级基类的构造函数,最后调用自身的构造函数; 销毁时首先调用自身的析构函数,而后自底向上地调用各级类类的析构函数。

对象生命周期示例 调用Grandsire的构造函数 调用Father的构造函数 调用Son的构造函数 调用Son的析构函数 public class BaseLifeSample { public static void Main() Son s1 = new Son(); System.GC.Collect(); } public class Grandsire public Grandsire() Console.WriteLine("调用Grandsire的构造函数"); ~Grandsire() Console.WriteLine("调用Grandsire的析构函数"); public class Father : Grandsire { public Father() Console.WriteLine("调用Father的构造函数"); } ~Father() Console.WriteLine("调用Father的析构函数"); public class Son : Father public Son() Console.WriteLine("调用Son的构造函数"); ~Son() Console.WriteLine("调用Son的析构函数"); 调用Grandsire的构造函数 调用Father的构造函数 调用Son的构造函数 调用Son的析构函数 调用Father的析构函数 调用Grandsire的析构函数

继承和多态性 多态性

多态性 多态性是指同一事物在不同条件下表现出不同的形态。 编译时的多态性 编译时的多态性是通过重载来实现的。对于非虚的成员来说,系统在编译时,根据传递的参数、返回的类型等信息决定实现何种操作。 运行时的多态性 运行时的多态性就是指直到系统运行时,才根据实际情况决定实现何种操作。C#中,运行时的多态性通过虚成员实现。 编译时的多态性为我们提供了运行速度快的特点,而运行时的多态性则带来了高度灵活和抽象的特点。

多态性 virtual/override:虚拟/重载 abstract/override :抽象/重载 sealed :密封,禁止重载 new: 编译时的多态性 override: 运行的多态性

new实现多态 Animal eat... Cat eat... public class Animal  { public virtual void Eat() {    Console.WriteLine("Animal eat"); } }  public class Cat : Animal { public new void Eat() {           Console.WriteLine("Cat eat"); } }      class Tester {         static void Main(string[] args)         {             Animal a = new Animal();             a.Eat();             Animal ac = new Cat();             ac.Eat();             Cat c = new Cat();             c.Eat();         }     } Animal eat... Cat eat... 派生类Cat的Eat()方法使用new修饰时,Cat的对象转换为Animal对象后,调用的是Animal类中的Eat()方法。 使用new关键字后,使得Cat中的Eat()方法和Animal中的Eat()方法成为毫不相关的两个方法,只是它们的名字碰巧相同而已。

virtual / override实现多态 public class Animal {     public virtual void Eat()     {         Console.WriteLine("Animal eat");     } } public class Dog : Animal     public override void Eat()         Console.WriteLine("Dog eat"); public class WolfDog : Dog         Console.WriteLine("WolfDog eat"); class Tester {     static void Main(string[] args)     {      Animal[] animals = new Animal[3];         animals[0] = new Animal();         animals[1] = new Dog();         animals[2] = new WolfDog();         for (int i = 0; i < 3; i++)         {             animals[i].Eat();         }     } } Animal eat... Dog eat... WolfDog eat...  如果基类中的一个方法使用virtual修饰,在用派生类的对象实例化的基类对象后,该基类对象调用这个方法会自动调用派生类中的重载方法。

abstract-override实现多态 public abstract class Animal { public abstract void Eat(); } public class Cat : Animal public override void Eat() Console.WriteLine("Cat eat"); public class Dog : Animal Console.WriteLine("Dog eat"); public class WolfDog : Dog { public override void Eat() Console.WriteLine("Wolfdog eat"); } class Tester static void Main(string[] args) Animal[] animals = new Animal[3]; animals[0] = new Cat(); animals[1] = new Dog(); animals[2] = new WolfDog(); for (int i = 0; i < animals.Length; i++) animals[i].Eat(); Cat eat... Dog eat... Wolfdog eat... 通过使用abstract-override可以和virtual-override一样地实现多态。不同之处在于,包含虚拟方法的类可以被实例化,而包含抽象方法的类不能被实例化。

抽象类与抽象方法 抽象方法一定属于抽象类,但抽象类不一定要包含抽象方法。 抽象方法必须重载。 抽象类无法创建实例,而是强制要求通过派生类来实现其功能。

密封类与密封方法 密封类不允许派生出其它类 密封方法不允许被重载 密封方法本身也要求是一个重载方法

密封类与密封方法示例 //程序清单P7_6.cs: using System; namespace P7_6 { public class SealedSample public static void Main() A a = new A1(); a.Output(); a = new A2(); a = new A1_1(); a = new A1_2(); } public abstract class A public abstract void Output(); public class A1 : A { public override sealed void Output() Console.WriteLine("A1"); } public sealed class A2 : A public override void Output() Console.WriteLine("A2"); public class A1_1 : A1 public class A1_2 : A1 public new void Output() Console.WriteLine("A1_2");