interface接口
继承"基类"跟继承"接口"都能实现某些相同的功能,但有些接口能够完成的功能是只用基类无法实现的.
1.接口用于描述一组类的公共方法/公共属性. 它不实现任何的方法或属性,只是告诉继承它的类至少要实现哪些功能,继承它的类可以增加自己的方法.
2.使用接口可以使继承它的类: 命名统一/规范,易于维护.比如: 两个类 "狗"和"猫",如果它们都继承了接口"动物",其中动物里面有个方法Behavior(),那么狗和猫必须得实现Behavior()方法,并且都命名为Behavior这样就不会出现命名太杂乱的现象.如果命名不是Behavior(),接口会约束即不按接口约束命名编译不会通过.
3.提供永远的接口.当类增加时,现有接口方法能够满足继承类中的大多数方法,没必要重新给新类设计一组方法,也节省了代码,提高了开发效率.
4.通过接口可以实现多重继承,C# 接口的成员不能有 public、protected、internal、private 等修饰符。原因很简单,接口里面的方法都需要由外面接口实现去实现方法体,那么其修饰符必然是public。C# 接口中的成员默认是 public 的.
接口有如下特性:
接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。
接口和抽象类:
1.都是“虚的”不能被实例化,这也是接口中为什么不能包含字段、成员变量的原因。
2.正因为接口是虚的,所以接口内的索引,属性,时间等只能有声明,而不能在接口内实现,具体如何实现是派生接口或者派生类的事。
3.都具有模板的性质,如果一个接口或者类从某一个接口继承,它将自动具有被集成者的特征(包括索引,属性,函数,实践等)。
4.接口支持多重继承,而C#中,类之支持单一继承,接口实际表示的是一种承载能力。
5.一个类可以实现多个interface,但只能继承一个abstract.
通常接口命名以大写 "I" 开头。
定义一个动物接口:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace interface接口 { class Program { static void Main(string[] args) { 狗 g = new 狗(); 猫 m = new 猫(); g.Name = "大黄"; m.Name = "小黑"; Console.WriteLine("狗狗名字:{0},叫唤:{1}",g.Name,g.叫()); Console.Write("狗狗吃:"); g.吃(); Console.WriteLine("猫猫名字:{0},叫唤:{1}", m.Name, m.叫()); Console.Write("猫猫吃:"); m.吃(); Console.ReadKey(); } } public interface I动物接口 //定义一个接口 { //接口方法不能用public abstract等修饰。接口内不能有字段变量,构造函数。 //类继承接口后,里面的方法必须全部实现。 string 叫();//接口方法,只定义 没有具体执行方法 void 吃();//参数和返回值的方法,只定义 没有具体执行方法 string Name //接口属性 { set; get; } } class 狗 : I动物接口 //狗 类继承 I动物接口 { private string name;//狗 类中的字段。 public string 叫()//接口有返回值方法。 { return "汪...汪..."; } public void 吃()//接口无返回值方法 { Console.WriteLine("骨头."); } public string Name //接口属性。 { get{return name;} set{name = value;} } } class 猫 : I动物接口 //猫 类继承 I动物接口 { private string name; //猫 类中的字段。 public string Name //接口属性。 { get{return name;} set{name = value;} } public string 叫() //接口有返回值方法。 { return "喵...喵..."; } public void 吃()//接口无返回值方法 { Console.WriteLine("小鱼."); } } }
输出结果: