1. 程式人生 > >C#學習筆記(十五):抽象方法、抽象類、多態和接口

C#學習筆記(十五):抽象方法、抽象類、多態和接口

具體實現 烏龜 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#學習筆記(十五):抽象方法、抽象類、多態和接口