【C# Lab】0002 接口&抽象類&多態性

示例:編寫Foo(HotDrink)函數,接受CupOfCoffee的對象作爲參數,該函數應爲傳遞給它的對象調用AddMilk()、AddSugar()、Drink()和Wash()方法。
注意:

  1. Wash()方法是ICup接口獨有的,而抽象類HotDrink不支持ICup接口,因此需要用到接口調用Wash()方法
  2. 支持接口的類必須實現接口內的所有成員
  3. 關於Console.Read(),它只讀一個字符,而用戶按下回車時會產生’\r’和’\n’額外兩個字符,需要兩個Console.Read()將它們濾去
  4. is檢查類HotDrink與接口ICup的兼容性,在兼容的前提下用as關鍵字實現類到接口的安全轉換
using System;
using static System.Console; //C#6特性

namespace test
{
    interface ICup
    {
        string Color { get; set; }
        int Volume { get; set; }
        void Refill();
        void Wash();
    }
    abstract class HotDrink
    {
        public bool milk;
        public bool sugar;
        public bool Milk
        {
            get { return milk; }
        }
        public bool Sugar
        {
            get { return sugar; }
        }
        public void Drink()
        {
            WriteLine("Drink.");
        }
        public void AddMilk()
        {
            WriteLine($"Add {(Milk==true?"":"no")} Milk.");
        }
        public void AddSugar()
        {
            WriteLine($"Add {(Sugar == true ? "":"no")} Sugar.");
        }
    }
    class CupOfCoffee : HotDrink, ICup
    {
        public string Color { get; set; }
        public int Volume { get; set; }

        public CupOfCoffee(bool milk,bool sugar)
        {
            this.milk = milk;
            this.sugar = sugar;
        }
        public void Refill()
        {
            WriteLine("CupOfCoffe refilled.");
        }

        public void Wash()
        {
            WriteLine("CupOfCoffe washed.");
        }
    }
    class Program
    {
        public void Foo(HotDrink drink)
        {
            drink.AddMilk();
            drink.AddSugar();
            drink.Drink();
            if(drink is ICup)
            {
                ICup cupInterface = drink as ICup;
                cupInterface.Wash();
            }
            
        }
        static void Main(string[] args)
        {
            WriteLine("add milk? Y/N");
            bool milk = (Convert.ToChar(Read())=='Y')?true:false;
            WriteLine(Read() == '\r' ? "回車" : "不是回車");//讀掉\n
            WriteLine(Read() == '\n' ? "換行" : "不是換行");//讀掉\r
            WriteLine("add sugar? Y/N");
            bool sugar = (Convert.ToChar(Read())=='Y')?true:false;
            CupOfCoffee cupOfCoffee = new CupOfCoffee(milk,sugar);
            Program p = new Program();
            p.Foo(cupOfCoffee);
            ReadKey();
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章