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("小鱼.");
}
}
}输出结果:
