【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();
        }
    }
}

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