【含义】接口是一种能力
【语法】
public interface MyInterface()
{
//该类下所有方法都是抽象方法:默认public abstract,而且不需要写
void door();
//其他抽象方法
//其他属性
}
【特性】
①接口不可以被实例化
②实现类必须实现接口的所有方法
③实现类可以实现多个接口(C#中的多继承)
④接口中的变量都是静态常量
【编写接口】
public interface IUsb
{
/**
*USB接口提供服务
*/
void service();
}
【实现接口】
①U盘:
//U盘 实现USB接口
public class UDisk : IUsb//如果是多个接口,使用,隔开
{
public void service()
{
Console.WriteLine("连接USB接口,开始传输数据....");
}
}
②硬盘:
//硬盘
public class HardDisk : IUSB//点击实现接口,自动生成代码
{
public void Service()
{
Console.WriteLine("硬盘传输数据中....");
}
}
【使用接口】
//用接口实现多态
IUsb iusb1 = new UDisk();//派生
uDisk.service();
IUSB iusb2 = new HardDisk();
iusb2.Service();
Console.Read();
【执行结果】
门有:开、关 的功能,锁有:上锁、开锁的功能
将门定义为抽象类、将锁定义为接口
防盗门继承门,实现锁的接口
【分析】防盗门 is a 门;防盗门 has a 锁
【定义门类】
namespace demo16_5
{
//门 抽象父类
public abstract class Door
{
public abstract void Open();//开门
public abstract void Close();//关门
}
}
【定义锁接口】
namespace demo16_5
{
///
/// 锁接口
///
public interface ILock
{
void Locked();//上锁
void OpenLock();//开锁
}
}
【定义门铃接口】
namespace demo16_5
{
///
/// 门铃接口
///
public interface IDoorMusic
{
void PlayMusic();//门铃(播放音乐)
}
}
【定义防盗门类】
using System.Media;//播放音乐
namespace demo16_5
{
public class TheProofDoor : Door,ILock,IDoorMusic
{
//将音乐放入Bin/Debug/wav文件夹下
SoundPlayer sp = new SoundPlayer("wav/Lemon tree (翻唱).wav");//播放音乐的插件类 其中的地址只能放.wav类型的
///
/// 关门
///
public override void Close()//重写
{
Console.WriteLine("关闭防盗门!");
}
///
/// 上锁
///
public void Locked()
{
Console.WriteLine("给防盗门上锁!");
}
///
/// 开门
///
public override void Open()//重写
{
Console.WriteLine("打开防盗门!");
}
///
/// 上锁
///
public void OpenLock()
{
Console.WriteLine("给防盗门开锁!");
}
///
/// 播放门铃音乐
///
public void PlayMusic()//override
{
sp.Play();//播放音乐
Console.WriteLine("正在播放门铃音乐!");
}
///
/// 关闭门铃音乐
///
public void StopMusic()//override
{
sp.Stop();//停止播放
Console.WriteLine($"停止播放门铃音乐!");
}
}
}
【定义卧室门类】
namespace demo16_5
{
public class BedRoomDoor : Door, ILock
{
//关门
public override void Close()
{
Console.WriteLine("关上卧室门!");
}
//上锁
public void Locked()
{
Console.WriteLine("给卧室上锁!");
}
//开门
public override void Open()
{
Console.WriteLine("打开卧室门!");
}
//开锁
public void OpenLock()
{
Console.WriteLine("给卧室门开锁!");
}
}
}
【定义厨房门类】
namespace demo16_5
{
///
/// 厨房门类
///
public class CookDoor : Door
{
///
/// 关门
///
public override void Close()
{
Console.WriteLine("关上厨房门!");
}
///
/// 开门
///
public override void Open()
{
Console.WriteLine("打开厨房门!");
}
}
}
【调用】
namespace demo16_5
{
class Program
{
static void Main(string[] args)
{
//创建一个防盗门
TheProofDoor theProofDoor1 = new TheProofDoor();
Console.WriteLine("请按门铃!");
string result = Console.ReadLine();
if (result == "1")
{
theProofDoor1.PlayMusic();
Console.WriteLine("等待主人来开门...等了3分钟");
}
//theProofDoor1.StopMusic();
theProofDoor1.OpenLock();
theProofDoor1.Open();
Console.WriteLine("人进入房间....");
theProofDoor1.Locked();
theProofDoor1.Close();
Console.WriteLine();
创建一个卧室门
//BedRoomDoor bedRoomDoor1 = new BedRoomDoor();
//bedRoomDoor1.OpenLock();
//bedRoomDoor1.Open();
//Console.WriteLine("人进入卧室!");
//bedRoomDoor1.Locked();
//bedRoomDoor1.Close();
//Console.WriteLine();
创建一个厨房门
//CookDoor cookDoor1 = new CookDoor();
//cookDoor1.Open();
//Console.WriteLine("人进入厨房!");
//cookDoor1.Close();
//Console.WriteLine();
Console.Read();
}
}
}
【执行结果】
定义墨盒接口、纸张接口
定义打印机类
实现墨盒接口、纸张接口
组装运行打印机
【定义打印机类】
namespace demo16_4
{
///
/// 打印机类
///
public class Printer
{
//预留接口
///
/// 预留墨盒接口
///
public IInkBox IInkBox { get; set; }
///
/// 预留纸张接口
///
public IPaper IPaper { get; set; }
///
/// 打印内容
///
public string Content { get; set; }
///
/// 打印功能
///
public void Print()
{
Console.WriteLine($"使用{this.IInkBox.Color}墨盒的打印机正在打印【{this.Content}】,纸张类型为【{this.IPaper.Size}】");
}
}
}
【定义墨盒接口】
namespace demo16_4
{
///
/// 墨盒接口(黑色、彩色)
///
public interface IInkBox
{
//默认public,不能写访问修饰符
string Color { get; set; }//颜色
}
}
【定义纸张接口】
namespace demo16_4
{
///
/// 纸张接口
///
public interface IPaper
{
string Size { get; set; }//纸张大小
}
}
【定义黑色墨盒类】
namespace demo16_4
{
///
/// 黑白墨盒
///
public class GrayInkBox : IInkBox
{
public string Color { get; set; } = "黑白";
}
}
【定义彩色墨盒类】
namespace demo16_4
{
///
/// 彩色墨盒
///
public class ColorInkBox : IInkBox
{
public string Color { get; set; } = "彩色";
}
}
【定义A4纸类】
namespace demo16_4
{
public class A4 : IPaper
{
public string Size { get; set; } = "A4";
}
}
【定义B5纸类】
namespace demo16_4
{
public class B5 : IPaper
{
public string Size { get; set; } = "B5";
}
}
【调用打印机】
namespace demo16_4
{
class Program
{
static void Main(string[] args)
{
//创建一个打印机
Printer printer1 = new Printer();
Printer printer2 = new Printer();
//对接墨盒
printer1.IInkBox = new ColorInkBox();//插入彩色墨盒
printer2.IInkBox = new GrayInkBox();//插入黑白墨盒
//对接纸张
printer1.IPaper = new A4();//插入A4纸
printer2.IPaper = new B5();//插入B5纸
//打印内容
printer1.Content = "测试数据";
printer2.Content = "学生基本信息表";
//打印
printer1.Print();
printer2.Print();
Console.Read();
}
}
}
【执行结果】
【好处】即插即拔,通过类来实现功能,接口中只定义了功能
【注】接口中定义字段是错误的,如:int type = 1;