示例:编写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();
}
}
}