C#學習筆記(十五):抽象方法、抽象類、多態和接口
阿新 • • 發佈:2019-02-11
具體實現 烏龜 ima 索引器 over protect ret 需要 技術
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace m1w4d1_abstract { //抽象函數、抽象類 //多態實現 寫一個動物的 抽象類,寫兩個子類狗狗叫,貓貓叫 //Animal類Cry方法裏寫具體實現的問題:寫什麽都不合適 //實例化 一個 animal的對象 他指代現實中 哪種對象 無法解釋 //如果有以上情況,我們可以用抽象函數,以便管理,以提高代碼可讀性//抽象函數 //抽象函數用abstract關鍵字修飾 //抽象函數只能存在於抽象類中 //抽象函數不允許你實現,不需要寫函數體,用空語句代替 //抽象類 //一個用abstract關鍵字修飾過的類,我們叫抽象類 //抽象類中可以有抽象成員,也可以有普通成員 //繼承了抽象類的派生類,必須實現抽象類所有的抽象成員 //抽象類不允許我們實例化,但是有構造函數並且可以重載 //所以我們在寫一個程序結構或者框架的時候會用到抽象類 class Animal { public virtual void Cry() { Console.WriteLine(""); } } class Cat : Animal { public override void Cry() { Console.WriteLine("喵喵"); } } class Dog : Animal { public override void Cry() { Console.WriteLine("汪汪"); } } //矩形:圖形 和 圓形:圖形 //多態實現求面積(area)和周長(perimeter)abstract class Sharp { public abstract void Area(); public abstract void Perimeter(); } class Circle : Sharp { public float r; public override void Area() { Console.WriteLine("面積:{0}", 3.14f * r * r); } public override void Perimeter() { Console.WriteLine("周長:{0}", 3.14f * 2 * r); } } class Rect: Sharp { public float width; public float high; public override void Area() { Console.WriteLine("面積:{0}", width * high); } public override void Perimeter() { Console.WriteLine("周長:{0}", (width + high) * 2); } } class Program { static void Main(string[] args) { //多態實現 寫一個動物的 抽象類,寫兩個子類狗狗叫,貓貓叫 Random roll = new Random(); Animal[] animals = new Animal[10]; for (int i = 0; i < animals.Length; i++) { int num = roll.Next(0, 2); if (num==0) { animals[i] = new Cat(); } else { animals[i] = new Dog(); } } foreach (var item in animals) { item.Cry(); } //矩形:圖形 和 圓形:圖形 //多態實現求面積(area)和周長(perimeter) } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace m1w4d1_interface { #region 接口的定義和練習1 //魚會遊泳,人走,遊泳,船會遊泳,烏龜走 會遊泳,天鵝走 飛 會遊泳 //多態實現 //批量管理 某一功能 //遊泳,走,飛 //不同對象 可以使用同一方法 表現不同行為 //這些對象要同一個結構(數組)裏 管理結構(容器) // //如果多個接口出現了同名的成員,在實現的時候,默認是共用的 //如果你想區分不同接口的不同方法,我們可以使用接口的顯示實現 //接口名.成員名 //顯示實現的成員必須由接口類型調用 //1,多繼承 //2,多態 //和類大體一致,關鍵字interface //成員沒有實現,函數是沒有函數體,用空語句,屬相必須是自動屬性 //成員只能是屬性,函數,事件,索引器 //成員必須是public,不用寫,也不能寫 //訪問修飾 關鍵字 接口名{} //接口名 命名 一般以 I 為前綴 public interface ISwim { void Swim(); } public interface IWalk { void Walk(); } public interface IFly { void Fly(); } public interface IBirdMan { void Swim(); } //接口使用: //我們可以用一個類來繼承已經定義好的接口:一對一,一對多,接口之間可以相互繼承 //如果在繼承關系中,這個類有繼承其它類,這個基類要放在繼承的第一位 //繼承一個接口必須實現這個接口所有成員 //能讓我們把物品按特定的功能統一管理 class Animal { public Animal(string name) { this.name = name; } protected string name; } class Machine { public Machine(string name) { this.name = name; } protected string name; } class GameObject { public GameObject(string name) { this.name = name; } public string name; } class Fish : Animal, ISwim { public Fish() : base("小魚") { Program.swims[Program.swimsCount++] = this; } public void Swim() { Console.WriteLine("{0}在遊泳", name); } } class Person : GameObject, ISwim, IWalk { public Person() : base("人類") { Program.swims[Program.swimsCount++] = this; Program.walks[Program.walksCount++] = this; } public void Swim() { Console.WriteLine("{0}在遊泳", name); } public void Walk() { Console.WriteLine("{0}在行走", name); } } class Ship : Machine, ISwim { public Ship() : base("輪船") { Program.swims[Program.swimsCount++] = this; } public void Swim() { Console.WriteLine("{0}在遊泳", name); } } class Swan : Animal, ISwim, IWalk, IFly { public Swan() : base("天鵝")//寫public,表明繼承和實現該接口成員,不寫則會認為是一個私有的新的方法 { Program.swims[Program.swimsCount++] = this; Program.walks[Program.walksCount++] = this; Program.flys[Program.flysCount++] = this; } public void Swim() { Console.WriteLine("{0}在遊泳", name); } public void Walk() { Console.WriteLine("{0}行走", name); } public void Fly() { Console.WriteLine("{0}在飛行", name); } } class BirdPerson : Person, IFly, IBirdMan { public BirdPerson() : base() { this.name = "鳥人"; Program.flys[Program.flysCount++] = this; } public void Fly() { Console.WriteLine("{0}在飛行", name); } void IBirdMan.Swim() { Console.WriteLine("{0}在潛水", name); } } #endregion #region 接口的練習2 //接口實現 //人口登記(Person) //汽車登記(Car ) //房子也要登記(House ) //都需要有註冊(Register)方法 public interface IRegister { void Register(); } class Name { public Name(string name) { this.name = name; } protected string name; } class Person1 : Name, IRegister { public Person1() : base("小明") { Program.registers[Program.registersCount++] = this; } public void Register() { Console.WriteLine("{人口登記:{0}已登記", name); } } class Car : Name, IRegister { public Car() : base("小車") { Program.registers[Program.registersCount++] = this; } public void Register() { Console.WriteLine("汽車登記:{0}已登記", name); } } class House : Name, IRegister { public House() : base("小房") { Program.registers[Program.registersCount++] = this; } public void Register() { Console.WriteLine("小房登記:{0}已登記", name); } } #endregion #region 接口的作業 //多態來模擬移動硬盤、U盤、MP3插到電腦上讀取數據 public abstract class MobileStorage { public abstract void Read(); public abstract void Write(); } public class MobileDisk : MobileStorage { public override void Read()//override可以重寫抽象方法和虛方法 { Console.WriteLine("移動硬盤在讀取數據"); } public override void Write() { Console.WriteLine("移動硬盤在寫入數據"); } } public class UDisk : MobileStorage { public override void Read() { Console.WriteLine("U盤在讀取數據"); } public override void Write() { Console.WriteLine("U盤在寫入數據"); } } public class Mp3 : MobileStorage { public override void Read() { Console.WriteLine("Mp3在讀取數據"); } public override void Write() { Console.WriteLine("Mp3在寫入數據"); } public void PlayMusic() { Console.WriteLine("MP3自己可以播放音樂"); } } public class Computer { //方法2,拿字段存傳入的父類參數 private MobileStorage _ms; public MobileStorage Ms//字段封裝屬性 { get { return _ms; } set { _ms = value; } } public void CpuRead()//方法1,想拿到父類,傳參數進來就行,可以傳子類進來 { Ms.Read();//方法2,通過屬性拿到父類,在外面不用傳參數,采用賦值 } public void CpuWrite() { Ms.Write(); } //public void CpuRead(MobileStorage ms)//方法1,想拿到父類,傳參數進來就行,可以傳子類進來 //{ // ms.Read(); //} //public void CpuWrite(MobileStorage ms) //{ // ms.Write(); //} } #endregion class Program { //static 修飾可以將類型,成員變成靜態 //資源共享 //唯一 //程序結束的時候才會釋放 public static ISwim[] swims = new ISwim[10]; public static int swimsCount = 0; public static IWalk[] walks = new IWalk[10]; public static int walksCount = 0; public static IFly[] flys = new IFly[10]; public static int flysCount = 0; public static IRegister[] registers = new IRegister[10]; public static int registersCount = 0; static void Main(string[] args) { #region 接口的定義和練習1 //Swan swan = new Swan(); //swan.Swim(); //Ship ship = new Ship(); //ship.Swim(); //Person P = new Person(); //P.Swim(); //ISwim[] swims = new ISwim[10]; //swims[0] = swan; //swims[1] = ship; //Console.WriteLine(); Fish f = new Fish(); Person P = new Person(); Ship ship = new Ship(); Swan swan = new Swan(); BirdPerson birdperson = new BirdPerson(); for (int i = 0; i < swimsCount; i++) { swims[i].Swim(); } for (int i = 0; i < walksCount; i++) { walks[i].Walk(); } for (int i = 0; i < flysCount; i++) { flys[i].Fly(); } #endregion #region 接口的練習2 //接口實現 //人口登記(Person) //汽車登記(Car ) //房子也要登記(House ) //都需要有註冊(Register)方法 Person1 p1 = new Person1(); Car car = new Car(); House house = new House(); for (int i = 0; i < registersCount; i++) { registers[i].Register(); } #endregion #region 接口的顯示實現 //Person person = new Person(); //ISwim iswim = person; //iswim.Swim(); //IBirdMan birdMen = person; //birdMen.Swim(); #endregion #region 接口的作業 //多態來模擬移動硬盤、U盤、MP3插到電腦上讀取數據 //多態 模擬 移動硬盤 插入電腦 讀寫 //MobileDisk md = new MobileDisk();//父類抽象類不能實例化,所以實例化子類 //UDisk ud = new UDisk(); //Mp3 mp = new Mp3(); MobileStorage mp = new Mp3(); Computer cpu = new Computer();//通過屬性拿到父類,在外面不能傳參數,采用賦值 cpu.Ms = mp;//表示把插入的MP3賦值給電腦裏面的Ms屬性 //cpu.CpuRead(mp); //cpu.CpuWrite(mp); cpu.CpuRead();//采用屬性賦值形式,不用傳參數 cpu.CpuWrite(); Console.ReadKey(); #endregion } } }
C#學習筆記(十五):抽象方法、抽象類、多態和接口