鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所

Slides:



Advertisements
Similar presentations
第五章 类的继承和派生 Inheritance/extends/derive. 教学目标 理解继承的概念和作用 派生类的定义 理解访问修饰符 protected 方法的重写 继承下的构造函数的使用 继承下的 finalize 方法的使用 理解超类和子类的关系.
Advertisements

系統分析與設計 楊子青 H-1 H 、物件導向技術 n 物件導向的基本概念 – 物件、類別 – 封裝、繼承 – 同名異式 ( 多型 ) 、超荷 ( 過載 ) n 物件導向分析與設計及塑模工具 n UML 塑模工具.
项目7 面向对象高级.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
四資二甲 第三週作業 物件導向程式設計.
C#程序设计案例教程 第3章 程 序 结 构.
第一章 面向对象程序设计.
程設一.
C#程序设计 10软件1、2班 王槐彬 计算机工程学院.
第二章 JAVA语言基础.
類別與物件 Class & Object.
第15章 繼承與多重繼承 15-1 繼承的基礎 15-2 覆寫與隱藏父類別的成員 15-3 子類別的建構與解構子 15-4 多重繼承
第三章 控制结构.
程設一.
程式設計實作.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
C#程序设计 c# programming 泛型 C#程序设计课程组.
第八章 C#高级编程.
H、物件導向技術 物件導向的基本概念 物件、類別 封裝、繼承 同名異式(多型) 、超荷(過載) 物件導向分析與設計及塑模工具 UML塑模工具.
第二章 C# 基础知识.
第四章 在 C# 中实现 OOP 概念.
Derived Class 前言 衍生類別的定義 單一繼承 public, protected, 和 privated 基底類別
Classes Lecturer: 曾學文.
第六章 类的扩展与继承.
程式敘述執行順序的轉移 控制與重複、方法 Lecturer:曾學文.
第三章 C#面向对象初级编程 面向对象得程序设计越来越受到编程人员的喜爱。类和对象是面向对象程序设计中的重要概念。封装性、继承性和多态性是面向对象的特点,本章旨在全面说明C#编写面向对象程序设计的方法。
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
C#程序设计基础 $3 成员、变量和常量.
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
第9章 多线程 王德俊 上海交通大学继续教育学院.
Java程序设计 第9章 继承和多态.
第4章 数组和集合 4.1 一维数组 4.2 二维数组 4.3 Array类 4.4 交错数组 4.5 ArrayList类
第三章 流程控制與例外處理 資訊教育研究室 製作 注意:本投影片僅供上課使用,非經同意,請勿散播或轉載。
C#面向对象程序设计 $7 继承和多态性.
第6章 继承和接口设计 6.1 继 承 6.2 多态性 6.3 抽象类 6.4 接口 6.5 接口在集合排序中的应用.
實作輔導 3 日期: 4/14(星期六) 09:10~12:00、13:10~16:00
例外處理與 物件序列化(Exception Handling and Serialization of Objects)
檔案讀寫與例外處理 (File IO and Exception Handling)
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
第5讲 使用类和对象编程(三) 内部类 实例 程序控制结构 选择语句.
第六章 属性、索引器、委托和事件.
類別與物件 I (Classes and Objects I)
第16章 虛擬與多形 16-1 虛擬函數 16-2 純虛擬函數與抽象類別 16-3 多形 16-4 虛擬繼承與虛擬解構子.
第三章 C# 基础知识.
第7章 繼承/多型/介面 注意: 本投影片僅供本書上課教師使用,非經同意請勿上網轉載或供拷貝.
《JAVA程序设计》 语音答疑 辅导老师:高旻.
第二章Java基本程序设计.
C#程序设计基础 $3 成员、变量和常量.
繼承與多型 (Inheritance and Polymorphism)
第二章 Java基本语法 讲师:复凡.
Inheritance -II.
<编程达人入门课程> 本节内容 为什么要使用变量? 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ:
第二章 Java语法基础.
鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所
目标 流程控制 字符串处理 C# 的类和对象 C# 访问修饰符 C# 构造函数和析构函数.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
方法進階及物件導向基礎 Lecturer: 楊昌樺.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
第6單元 6-1 類別的繼承 (Class Inheritance) 6-2 抽象類別 (Abstract Class)
C# 匿名委派 + Lambda + Func 建國科技大學 資管系 饒瑞佶.
PPT注意事项: 当前PPT课件文件必须和提供的源代码文件夹“代码”在同一目录中即不要移动文件夹“代码”的默认位置。
JAVA 程式設計與資料結構 第三章 物件的設計.
第2章 Java语言基础.
C#快速導讀 流程控制.
第二章 Java基础语法 北京传智播客教育
第二章 Java基本语法 讲师:复凡.
第6章 继承和多态 伍孝金
Presentation transcript:

鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所 繼承 (Inheritance) 鄭士康 國立台灣大學 電機工程學系/電信工程研究所/ 資訊網路與多媒體研究所

UsingInheritance.Program (1/7) using System; namespace UsingInheritance { /* * 示範繼承的使用 * 4/23/2007 */ class Program static void Main(string[] args) AdvancedCalculator calculator = new AdvancedCalculator();

UsingInheritance.Program (2/7) int op = 0; int operand1 = 0; int operand2 = 0; int result; double angle = 0.0; double functionValue; do { Console.Write( "指定運算: 0. 結束; 1. 加; 2. 減; 3. 乘; 4. 除; " + " \n 5. 正弦函數; 6. 餘弦函數; 7. 正切函數: "); op = int.Parse(Console.ReadLine()); if (op == 0) break; if (op > 7) continue;

UsingInheritance.Program (3/7) if (op < 5) { Console.Write("輸入第一個數字: "); operand1 = int.Parse(Console.ReadLine()); Console.Write("輸入第二個數字: "); operand2 = int.Parse(Console.ReadLine()); } else Console.Write("輸入角度(度)"); angle = double.Parse(Console.ReadLine()); switch (op)

UsingInheritance.Program (4/7) case 1: result = calculator.Add(operand1, operand2); Console.WriteLine("{0} + {1} = {2} ", operand1, operand2, result); break; case 2: result = calculator.Subtract(operand1, Console.WriteLine("{0} - {1} = {2} ", case 3: result = calculator.Multiply(operand1,

UsingInheritance.Program (5/7) Console.WriteLine("{0} * {1} = {2} ", operand1, operand2, result); break; case 4: result = calculator.Divide(operand1, operand2); Console.WriteLine("{0} / {1} = {2} ", case 5: functionValue = calculator.getSine(angle); Console.WriteLine( "Sine of {0} (deg) = {1}", angle, functionValue);

UsingInheritance.Program (6/7) case 6: functionValue = calculator.getCosine(angle); Console.WriteLine( "Cosine of {0} (deg) = {1}", angle, functionValue); break; case 7: calculator.getTangent(angle); "Tangent of {0} (deg) = {1}",

UsingInheritance.Program (7/7) default: Console.WriteLine( "Should not see this message. Debug!!!"); break; } } while (true);

UsingInheritance.AdvancedCalculator (1/2) using System; namespace UsingInheritance { /* * 可計算三角函數之計算器 * 4/23/2007 */ public class AdvancedCalculator : Calculator public double getSine( double angle ) angle *= Math.PI/180.0; return Math.Sin(angle); }

UsingInheritance.AdvancedCalculator (2/2) public double getCosine( double angle ) { angle *= Math.PI/180.0; return Math.Cos(angle); } public double getTangent( double angle ) return Math.Tan(angle);

UsingInheritance.Calculator (1/2) using System; namespace UsingInheritance { /* * 計算器 * 3/17/2007 */ class Calculator public int Add(int a, int b) int result = a + b; return result; }

UsingInheritance.Calculator (2/2) public int Subtract(int a, int b) { int result = a - b; return result; } public int Multiply(int a, int b) { int result = a * b; public int Divide(int a, int b) { int result = a / b;

表示繼承的UML類別圖 Calculator Add() Subtraction() Multiply() Divide() AdvancedCalculator getSine() getCosine() getTangent()

類別繼承之階層關係 A B C class A { public int data1; public int data2; //…other members are methods }; class B : public A { public int data3; class C : public B { public int data4; A B C

物件記憶體分配模型 data1 data2 data3 a c A.data1 data2 data3 data1 b data4 A a; B b; C c; data1 data2 data3 a c A.data1 data2 data3 data1 b data4

UsingProtected.Program (1/2) using System; namespace UsingProtected { /* 示範protected成員之使用 * 4/23/2007 */ class Program static void Main(string[] args) DC d = new DC(); d.setX(3); //Console.WriteLine( d.getX() ) ; // Error! // d.x = 77; // Error! d.add2(); }

UsingProtected.Program (2/2) public class BC { public void setX( int x ) { this.x = x; } protected int getX() { return x; } private int x; } public class DC : BC public void add2() int c = getX(); setX( c+2 );

限制繼承 sealed class SClass { . . . . . . }

物件導向的關鍵技術 封裝(packaging) 繼承(inheritance) 多型(polymorphism)

多型 編譯時連結(compile-time binding)與執行時連結(run-time binding) 多型之要求 多型之優缺點 靜態連結(static binding)與動態連結(dynamic binding) 多型之要求 繼承階層體系 虛擬(virtual)與覆寫(override) 基礎類別之參考 多型之優缺點

UsingOverride.Program (1/3) using System; namespace UsingOverride { /* 示範方法函式之覆寫(overriding)與多型 * 5/2/2007 */ class Program static void Main(string[] args) Console.WriteLine( "選擇列印尺寸規格: 1. B4 ; 2. A3 ; 其他: 標準(A4)");

UsingOverride.Program (2/3) int reportType = int.Parse(Console.ReadLine()); Console.WriteLine(); Printer pr; switch (reportType) { case 1: pr = new PrinterB4(); pr.Print(); break; case 2: pr = new PrinterA3(); default: pr = new Printer(); }

UsingOverride.Program (3/3) Console.WriteLine(); Console.ReadLine(); }

UsingOverride.Printer (1/2) using System; namespace UsingOverride { /* * 模擬標準印表機 * 5/1/2007 */ class Printer public Printer() Console.WriteLine("印表機備便"); } virtual public void Print() Console.WriteLine("列印標準尺寸"); Finish("標準"); Printer Print()

UsingOverride.Printer (2/2) protected void Finish(string type) { Console.WriteLine("{0}報表列印完成", type); }

UsingOverride. PrinterB4 using System; namespace UsingOverride { /* * 模擬B4印表程式 * 5/1/2007 */ class PrinterB4 : Printer { public PrinterB4() { Console.WriteLine("B4尺寸列印程式備便"); } override public void Print() { Console.WriteLine("列印B4尺寸"); Finish("B4");

UsingOverride. PrinterA3 using System; namespace UsingOverride { /* * 模擬A3印表程式 * 5/1/2007 */ class PrinterA3 : Printer { public PrinterA3() { Console.WriteLine("A3尺寸列印程式備便"); } override public void Print() { Console.WriteLine("列印A3尺寸"); Finish("A3");

練習 撰寫類別Shape,定義虛擬方法Draw為輸出”畫形狀”字樣。其次撰寫類別Rectangle及Circle,分別覆寫Draw為輸出字串”畫長方形”及”畫圓形” 。寫一程式測試此一繼承結構之多型機制。

UsingBase.Program (1/6) using System; namespace UsingBase { /* 示範base與new關鍵字的用法 * Ref: C# 程式設計人員參考 * 瞭解使用Override 和New 關鍵字的時機(C# 程式設計手冊) * ms-help://MS.VSExpressCC.v80/MS.NETFramework.v20.cht/dv_csref/html/323db184-b136-46fc-8839-007886e7e8b0.htm * 5/2/2007 */ class Program static void Main(string[] args)

UsingBase.Program (2/6) // new and override make no differences here Car car1 = new Car(); car1.DescribeCar(); System.Console.WriteLine("----------"); ConvertibleCar car2 = new ConvertibleCar(); car2.DescribeCar(); Minivan car3 = new Minivan(); car3.DescribeCar();

UsingBase.Program (3/6) // they are different in polymorphysm Car[] cars = new Car[3]; cars[0] = new Car(); cars[1] = new ConvertibleCar(); cars[2] = new Minivan(); foreach (Car vehicle in cars) { System.Console.WriteLine("Car object: " + vehicle.GetType()); vehicle.DescribeCar(); System.Console.WriteLine("----------"); }

UsingBase.Program (4/6) // Define the base class class Car { public virtual void DescribeCar() System.Console.WriteLine( "Four wheels and an engine."); }

UsingBase.Program (5/6) // Define the derived classes class ConvertibleCar : Car { public new virtual void DescribeCar() base.DescribeCar(); System.Console.WriteLine( "A roof that opens up."); }

UsingBase.Program (6/6) class Minivan : Car { public override void DescribeCar() base.DescribeCar(); System.Console.WriteLine( "Carries seven people."); }

覆寫與隱藏 覆寫: override 隱藏: new 主要用於Polymorphism (多型) 執行時連結 只是取代基底類別同名之成員變數與方法 仍是編譯時連結

UsingConstructorsForInheritance.Program (1/4) using System; namespace UsingConstructorsForInheritance { /* * 示範繼承架構中的建構式呼叫 * 5/2/2007 */ class Program { static void Main(string[] args) { Animal slug = new Animal(); Animal tweety = new Animal( "canary" ); Primate godzilla = new Primate(); Primate human = new Primate( 4 ); Human jill = new Human(); Console.ReadLine(); }

UsingConstructorsForInheritance.Program (2/4) class Animal { public Animal() Console.WriteLine("Animal()"); species = "Animal"; } public Animal( string s ) Console.WriteLine("Animal("+ s +")"); species = s; private string species;

UsingConstructorsForInheritance.Program (3/4) class Primate : Animal { public Primate() : base() Console.WriteLine( "Primate()" ); } public Primate( int n ) : base( "Primate" ) Console.WriteLine("Primate(" + n +")"); heartCham = n; private int heartCham;

UsingConstructorsForInheritance.Program (4/4) class Human : Primate { public Human() : base( 4 ) Console.WriteLine( "Human()" ); }

預設類別System.Object 一致化型別 成員函式 Equals GetHashCode GetType ReferenceEquals ToString Finalize

InheritingObject.Program (1/2) using System; namespace InheritingObject { /* * 示範Object類別 * 5/2/2007 */ class Program { static void Main(string[] args) { Test t1 = new Test(); Test t2 = new Test(); bool isEqual = t1.Equals(t2); Console.WriteLine(t1.ToString()); Console.WriteLine("t1 與t2 相等為" + isEqual); Console.ReadLine(); }

InheritingObject.Program (2/2) class Test { override public string ToString() return "覆寫InheritingObject.Test"; }

Boxing 與 Unboxing int x = 10; Object obj = (Object) x; // boxing int j = (int)obj; // unboxing