C#-接口(Interface)详解

定义

在 C# 语言中,类之间的继承关系仅支持单重继承,而接口是为了实现多重继承关系设计的。一个类能同时实现多个接口,还能在实现接口的同时再继承其他类,并且接口之间也可以继承。无论是表示类之间的继承还是类实现接口、接口之间的继承,都使用“:”来表示。

接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做" 部分。

定义接口语法:

interface  接口名称
{
    接口成员;
}

接口命名通常以 I 字母开头,例如Itest。
接口成员,不允许使用 public、private、protected、internal 访问修饰符,不允许使用 static、virtual、abstract、sealed 修饰符。不能定义字段,定义的方法不能包含方法体。

示例:定义一本书的接口,有id、名称name、定价price几个属性,和一个方法售卖价SalePrice()。

using System;

namespace app
{
    interface IBook
    {
        int Id { get; set; }
        string Name { get; set; }
        double Price { get; set; }
        double SalePrice(int discount);
    }
}  

实现

接口的实现与类的继承语法格式类似,也是重写了接口中的方法,让其有了具体的实现内容。

实现接口语法:

class  类名 : 接口名
{
    //类中的成员以及实现接口中的成员
}

在实现接口的成员时有两种方式,隐式实现接口成员和显式实现接口成员。隐式实现接口成员是将接口的所有成员以 public 访问修饰符修饰。显式实现接口是指在实现接口时所实现的成员名称前含有接口名称作为前缀。
下面对一本书的接口分别使用隐式实现和显式实现。

隐式实现:

class Book:IBook
    {
        // 隐式的实现接口中的属性
        public int Id { get; set; }
        public string Name { get; set; }
        public double Price { get; set; }

        // 隐式实现接口中的方法
        public double SalePrice(int discount)
        {
            double salePrice = Price * discount * 0.1;
                        return salePrice;
        }

    }

隐式实现后进行运行:

class Program
    {
        static void Main(string[] args)
        {
            Book book = new Book();
            book.Id = 1001;
            book.Name = "tynam";
            book.Price = 60;

            Console.WriteLine("id:{0}" , book.Id);
            Console.WriteLine("书名:{0}" , book.Name);
            Console.WriteLine("定价:{0}", book.Price);
            Console.WriteLine("售卖价:{0}", book.SalePrice(8));
        }
    }

运行后结果:

id:1001
书名:tynam
定价:60
售卖价:48

显式实现:

class Book:IBook
    {
        public double Price { get; set; }
        // 显示的实现接口中的属性
        int IBook.Id { get; set; }
        string IBook.Name { get; set; }

        // 显式实现接口中的方法
        double IBook.SalePrice(int discount)
        {
            double salePrice = Price * discount * 0.1;
                        return salePrice;
        }

    }

显式实现后进行运行:

class Program
    {
        static void Main(string[] args)
        {
            Book book = new Book();
            IBook bookDetail = book;
bookDetail.Id = 1001;
            bookDetail.Name = "tynam";
            bookDetail.Price = 60;

            Console.WriteLine("id:{0}" , bookDetail.Id);
            Console.WriteLine("书名:{0}" , bookDetail.Name);
            Console.WriteLine("定价:{0}", bookDetail.Price);
            Console.WriteLine("售卖价:{0}", bookDetail.SalePrice(8));
        }
    }

运行后结果:

id:1001
书名:tynam
定价:60
售卖价:48

注意:接口无法直接进行实例化。 其成员由实现接口的任何类或结构来实现。

多态

使用接口实现多态 需要满足以下两个条件。
定义接口并使用类实现了接口中的成员。
创建接口的实例指向不同的实现类对象。

示例:定义一个接口名称为 IBird,分别定义两个实现类 Phoenix 和 Duck 来实现接口的成员,代码如下。

interface IBird
        {
            void fly();
        }

        class Phoenix : IBird
        {
            public void fly()
            {
                Console.WriteLine("凤凰会飞");
            }
        }

        class Duck : IBird
        {
            public void fly()
            {
                Console.WriteLine("鸭子也会飞");
            }
        }

实例化后执行:

class Program
        {
                static void Main(string[] args)
                {
                        IBird phoenix = new Phoenix();
                        phoenix.fly();
                        IBird duck = new Duck();
                        duck.fly();
                }
        }

执行结果:

凤凰会飞
鸭子也会飞
(0)

相关推荐

  • Lambda表达式

    记录 Lambda. 两种显示形式: // 第一种:表达式Lambda,右边主体为表达式. (parameters) => expression // 第二种:语句Lambda,右边主体为语句块 ...

  • (6条消息) SSD硬盘的接口区别详解图解 SATA、mSATA、PCI

    转 扫盲:SATA.mSATA .PCIe和M.2--SSD硬盘的接口 2019年03月02日 20:47:06 nedwons 阅读数 11035更多 个人分类: 非技术 SATAT通道:硬盘--内 ...

  • lightning接口内部结构详解

    描述 lightning接口 苹果高速多功能I/O接口是2012年9月12日,美国旧金山芳草地会议中心苹果发布了全新的Lightning Dock接口,中文可将其译为"闪电"接口. ...

  • 电脑ATX电源接口定义详解

    2009年08月23日 星期日 01:19 红线框起来的是新24P增加的接口面对安全扣,左4(COM)--右4短接(PS_ON#),开启电源(空载).电源输出导线有这9种颜色:黄.红.橙.紫.蓝.白. ...

  • 网络机顶盒使用技巧揭秘,各个接口功能详解!

    智能电视可以通过网络带给大家舒适的观看体验,但是高昂的价格导致一部分用户望而却步,其实一个小小的电视机顶盒也可以实现这个功能,它改变了以往被动的电视机观看模式,实现了电视按需观看.随看随停的效果. 网 ...

  • SPI接口详解

    SPI(Serial Peripheral Interface,串行外围设备接口)是由Motorola公司开发,用来在微控制器和外围设备芯片之间提供一个低成本.易使用的接口(SPI有时候也被称为4线接 ...

  • 【IBE】详解DVI、HDMI、VGA这几个接口!值得看看!

    安防行业中,经常会接触到高清设备接口,通常碰到的高清接口有DVI.HDMI.VGA. 我们一般会在网络上或者技术杂志上了解高清接口概念,但因为有些技术文章写的笼统混淆,会对这些接口产生了一些技术误解. ...

  • (2) Java SQL框架(java.sql.*)中常用接口详解

    Driver接口:定义了一个驱动程序接口,每一个数据库的JDBC driver都应该实现这个接口,用于访问对应的数据库.比如MySQL的driver为com.mysql.jdbc.Driver.Jav ...

  • LVDS接口详解

    LVDS接口详解

  • MODBUS 485通讯常见物理接口——DB9接口详解

    做工业自动化的朋友经常接触到的通讯协议如RS232,RS485,它的通讯线物理接口大部分DB9接口,如果需要对总线上的数据进行监听的时候,只需要做一条三通线,通过USB转485转换插头连接到电脑就可以 ...