C# 接口(接口可以继承接口)

接口可以继承接口

之前我们已经知道接口实现可以从基类被继承,而接口本身也可以从一个或多个接口继承而来。

  • 要指定某个接口继承其他的接口,应在接口声明中把基接口名称以逗号分隔的列表形式

    放在接口名称后面的冒号之后,如下所示。

  • 类在基类列表中只能有一个类名,而接口可以在基接口列表中有任意多个接口。

    • 列表中的接口本身可以继承其他接口。
    • 结果接口包含它声明的所有成员和基接口的所有成员。
      图16-11中的代码演示了3个接口的声明。IDataIO接口从前两个接口继承而来图右边部分
      显示IDataIO包含了另外两个接口。
csharp 复制代码
interface IDataIO:IDataRetrieve,IDatatStore
{
    interface IDataRetrieve
    {
        int GetData();
    }

    interface IDatatStore
    {
        void SetData(int x);
    }
    //从前两个接口继承而来
    interface IDataIO:IDataRetrieve,IDatatStore
    {

    }

    class MyData:IDataIO{
        int nPrivateData;
        public int GetData()
        {
            return nPrivateData;
        }

        public void SetData(int x)
        {
            nPrivateData=x;
        }
    }

    class Program{
        static void Main(){
            MyData data=new MyData();
            data.SetData(5);
            Console.WriteLine("{0}",data.GetData());
        }
    }
}

不同类实现一个接囗的示例

如下代码演示了已经介绍过的接口的一些方面。程序声明一个名为Animal的类,它被作为

其他一些表示各种类型动物的类的基类。它还声明了一个叫作ILiveBirth的接口。

Cat、Dog和Bird类都从Animal基类继承而来。Cat和Dog都实现了ILiveBirth接口,而Bird

类没有。

在Main中,程序创建了Animal对象的数组并用3个动物类的对象进行填充。然后,程序遍

历数组并使用as运算符获取指向ILiveBirth接口的引用,并调用了BabyCalled方法。

csharp 复制代码
interface ILiveBirth   //声明接口
{
    string BabyCalled();
}

class Animal{}   //基类Animal

class Cat:Animal,ILiveBirth    //声明Cat类
{
    string ILiveBirth.BabyCalled()
    {return "kitten";}
}

class Dog:Animal,ILiveBirth    //声明Dog类
{
    string ILiveBirth.BabyCalled()
    {
        return "puppy";
    }

    class Bird:Animal          //声明Bird类
    {

    }

    class Program
    {
        static void Main()
        {
            Animal[] animalArray=new Animal[3];   //创建Animal数组
            animalArray[0]=new Cat();             //插入Cat类对象
            animalArray[1]=new Bird();            //插入Bird类对象
            animalArray[2]=new Dog();             //插入Dog类对象
            foreach(Animal a in animalArray)      //在数组中循环
            {
                ILiveBirth b= a as ILiveBirth;    //如果实现ILiveBirth
                if(b!=null)
                    Console.WriteLine($"Baby is called:{b.BabyCalled()}");
            }
        }
    }
}

图16-12演示了内存中的数组和对象。

相关推荐
前端小L20 小时前
回溯算法专题(十):二维递归的完全体——暴力破解「解数独」
数据结构·算法
Java爱好狂.21 小时前
复杂知识简单学!Springboot加载配置文件源码分析
java·spring boot·后端·spring·java面试·后端开发·java程序员
Array*21 小时前
java实现word中插入附件(支持所有文件格式)
java·开发语言·word·poi·ole
Donald_brian21 小时前
线程同步
java·开发语言·jvm
全靠bug跑21 小时前
Nacos 入门实战:部署、服务注册与发现全指南
java·spring cloud·docker·nacos
郑州光合科技余经理21 小时前
技术视角:海外版一站式同城生活服务平台源码解析
java·开发语言·uni-app·php·排序算法·objective-c·生活
喵了meme21 小时前
Linux学习日记19:线程同步与互斥锁
java·jvm·学习
AI科技星21 小时前
姬无烦科幻与张祥前统一场论的完美融合
数据结构·人工智能·算法·机器学习·重构
郑州光合科技余经理21 小时前
海外版生活服务系统源码 | 外卖+跑腿一站式平台技术解析
java·开发语言·javascript·git·spring cloud·php·生活
小小Fred21 小时前
Cortex-M3 LR寄存器的特殊值EXC_RETURN
java·开发语言·jvm