示例:編寫Foo(HotDrink)函數,接受CupOfCoffee的對象作爲參數,該函數應爲傳遞給它的對象調用AddMilk()、AddSugar()、Drink()和Wash()方法。
注意:
- Wash()方法是ICup接口獨有的,而抽象類HotDrink不支持ICup接口,因此需要用到接口調用Wash()方法
- 支持接口的類必須實現接口內的所有成員
- 關於Console.Read(),它只讀一個字符,而用戶按下回車時會產生’\r’和’\n’額外兩個字符,需要兩個Console.Read()將它們濾去
- 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();
}
}
}