三十三、C#中的接口

1.接口

【含义】接口是一种能力

【语法】

public interface MyInterface()
{
    //该类下所有方法都是抽象方法:默认public abstract,而且不需要写
    void door();
    //其他抽象方法
    //其他属性
}

【特性】

①接口不可以被实例化

②实现类必须实现接口的所有方法

③实现类可以实现多个接口(C#中的多继承)

④接口中的变量都是静态常量

 

案例一:USB接口(面向接口编程)

【编写接口】

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
{
    /// <summary>
    /// 锁接口
    /// </summary>
    public interface ILock
    {
        void Locked();//上锁
        void OpenLock();//开锁
    }
}

【定义门铃接口】

namespace demo16_5
{
    /// <summary>
    /// 门铃接口
    /// </summary>
    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类型的


        /// <summary>
        /// 关门
        /// </summary>
        public override void Close()//重写
        {
            Console.WriteLine("关闭防盗门!");
        }

        /// <summary>
        /// 上锁
        /// </summary>
        public void Locked()
        {
            Console.WriteLine("给防盗门上锁!");
        }

        /// <summary>
        /// 开门
        /// </summary>
        public override void Open()//重写
        {
            Console.WriteLine("打开防盗门!");
        }

        /// <summary>
        /// 上锁
        /// </summary>
        public void OpenLock()
        {
            Console.WriteLine("给防盗门开锁!");
        }
       

        /// <summary>
        /// 播放门铃音乐
        /// </summary>
        public void PlayMusic()//override
        {
            sp.Play();//播放音乐
            Console.WriteLine("正在播放门铃音乐!");
        }
        /// <summary>
        /// 关闭门铃音乐
        /// </summary>
        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
{
    /// <summary>
    /// 厨房门类
    /// </summary>
    public class CookDoor : Door
    {
        /// <summary>
        /// 关门
        /// </summary>
        public override void Close()
        {
            Console.WriteLine("关上厨房门!");
        }

        /// <summary>
        /// 开门
        /// </summary>
        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();
        }
    }
}

【执行结果】

 

案例三:用C#接口实现打印机

定义墨盒接口、纸张接口

定义打印机类

实现墨盒接口、纸张接口

组装运行打印机

【定义打印机类】

namespace demo16_4
{
    /// <summary>
    /// 打印机类
    /// </summary>
    public class Printer
    {
        //预留接口

        /// <summary>
        /// 预留墨盒接口
        /// </summary>
        public IInkBox IInkBox { get; set; }

        /// <summary>
        /// 预留纸张接口
        /// </summary>
        public IPaper IPaper { get; set; }

        /// <summary>
        /// 打印内容
        /// </summary>
        public string Content { get; set; }

        /// <summary>
        /// 打印功能
        /// </summary>
        public void Print()
        {
            Console.WriteLine($"使用{this.IInkBox.Color}墨盒的打印机正在打印【{this.Content}】,纸张类型为【{this.IPaper.Size}】");
        }
    }
}

【定义墨盒接口】

namespace demo16_4
{
    /// <summary>
    /// 墨盒接口(黑色、彩色)
    /// </summary>
    public interface IInkBox
    {
        //默认public,不能写访问修饰符
        string Color { get; set; }//颜色
    }
}

【定义纸张接口】

namespace demo16_4
{
    /// <summary>
    /// 纸张接口
    /// </summary>
    public interface IPaper
    {
        string Size { get; set; }//纸张大小
    }
}

【定义黑色墨盒类】

namespace demo16_4
{
    /// <summary>
    /// 黑白墨盒
    /// </summary>
    public class GrayInkBox : IInkBox
    {
        public string Color { get; set; } = "黑白";
    }
}

【定义彩色墨盒类】

namespace demo16_4
{
    /// <summary>
    /// 彩色墨盒
    /// </summary>
    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;

 

 

 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 点我我会动 设计师:上身试试 返回首页