接口可以继承接口
之前我们已经知道接口实现可以从基类被继承,而接口本身也可以从一个或多个接口继承而来。
-
要指定某个接口继承其他的接口,应在接口声明中把基接口名称以逗号分隔的列表形式
放在接口名称后面的冒号之后,如下所示。 -
类在基类列表中只能有一个类名,而接口可以在基接口列表中有任意多个接口。
- 列表中的接口本身可以继承其他接口。
- 结果接口包含它声明的所有成员和基接口的所有成员。
图16-11中的代码演示了3个接口的声明。IDataIO接口从前两个接口继承而来图右边部分
显示IDataIO包含了另外两个接口。
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方法。
interface ILiveBirth //声明接口
{string BabyCalled();
}class Animal{} //基类Animalclass 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; //如果实现ILiveBirthif(b!=null)Console.WriteLine($"Baby is called:{b.BabyCalled()}");}}}
}
图16-12演示了内存中的数组和对象。