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演示了内存中的数组和对象。

相关推荐
devilnumber1 天前
Java 递归算法 详解 + 核心要点 + 实战运用 + 避坑指南
java·开发语言·算法
asdfg12589631 天前
JavaBean是什么?怎么理解?有什么用途?
java·开发语言
‎ദ്ദിᵔ.˛.ᵔ₎1 天前
双指针、滑动窗口、前缀和、二分查找 算法
算法
顾北顾1 天前
多头注意力机制
人工智能·深度学习·算法
H178535090961 天前
SolidWorks_基于草图的实体特征20_特征错误排查
算法·3d建模·solidworks
hujinyuan201601 天前
2025年12月中国电子学会青少年机器人技术等级考试试卷(二级) 真题+答案
人工智能·算法·机器人
z落落1 天前
C#WinForm 窗体切换与窗体传值(登录跳转案例)+WinForm 窗体传值(从上往下传、从下往上传)
开发语言·windows·c#
摇滚侠1 天前
SpringMVC 入门到实战 文件上传 75-77
java·后端·spring·maven·intellij-idea
GIS数据转换器1 天前
城市排水生命线安全运行监测平台深度解析
java·运维·人工智能·python·安全·数据挖掘·无人机
bIo7lyA8v1 天前
算法复杂度评估的实验统计方法与可视化的技术8
算法