前言:相信在生活中,"接口"这个词对于大家来说都不陌生吧,比如说:很多不同的软件都拥有查看天气这个功能,难道说每个软件都有对应的气象局?这是因为气象局给了它们一个接口,进而实现天气功能的,显而易见接口的作用了,今天跟随博主一起来了解一下"接口"吧
一.接口含义:
接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 "是什么" 部分,派生类定义了语法合同 "怎么做"部分。通俗来讲就是接口定义了一些行为,继承接口的类应该必须拥有这些行为,按照这些行为去做...
二.接口的声明:
接口必须用关键字interface
来进行声明,一般格式如下所示:
访问修饰符 interface interface_name
{
接口成员
}
复制代码
举例:我们定义了一个接口...
interface INmyface//接口一
{
}
复制代码
接口的默认修饰符为public
哦 !注意:接口只能用 public 和 internal 访问修饰符
!!!否则就会报错,例如:
三.接口成员:
1.接口成员的包含:
接口成员:接口只包含方法、属性、索引器和事件的签名
2.接口成员的定义:
接口成员定义与类成员定义相似,但是要注意:接口中成员变量的默认访问修饰符为 final ,成员方法的默认访问修饰符为 static
1. 接口成员不允许使用访问修饰符(public,private,protected 或 internal)
,所有的接口成员都必须是公共的;举例:
2.接口成员不能用关键字static,virtual,abstrac t或 sealed
来对其定义;举例:
3. 接口成员不能包含代码实体;4.接口成员不能定义字段成员;举例:我们定义了一个字段 A 会提示报错:
3.举例:
我们定义了一个接口,并定义了几个接口成员:
interface INmyface//接口一
{
//4个方法
void Run();
void Say();
void Eat();
void Sleep();
//一个属性
int Age { get ; set; }
}
复制代码
四.接口的特点:
1. 接口必须用interface
进行声明;
interface INmyface//接口一
{
}
复制代码
2. 接口中只能放成员的声明;
interface INmyface//接口一
{
void Run();
void Say();
void Eat();
void Sleep();
int Age { get ; set; }
}
复制代码
3. 继承接口必须实现接口中的所有成员,如果在接口中新增成员的声明,而在继承的类中没有进行实现时,就会报错,如:
4. 接口之间可以互相继承,但是要实现接口功能的派生类必须实现每个接口的成员:如:我们定义了一个接口INmyface
,另一个接口INsecond
继承了INmyface
这个接口,那么当子类继承INsecond
这个接口时,就要实现这两个接口中所有的成员:
interface INmyface//接口一
{
void Run();
void Say();
void Eat();
void Sleep();
int Age { get ; set; }
void DDD();
}
interface INsecond : INmyface//继承接口,接口之间的继承
{
void Day();
}
class Son : INsecond
{
public int Age { get => throw new NotImplementedException(); set => throw new NotImplementedException(); }
public void Day()//继承接口以后,接口二独有的方法
{
Console.WriteLine("我是第二个接口中独有的方法");
}
public void DDD()
{
Console.WriteLine("我会打游戏,---来自第一个接口");
}
public void Eat()
{
Console.WriteLine("我会吃,---来自第一个接口");
}
public void Run()
{
Console.WriteLine("我会跑---来自第一个接口");
}
public void Say()
{
Console.WriteLine("我会说话---来自第一个接口");
}
public void Sleep()
{
Console.WriteLine("我会睡觉---来自第一个接口");
}
}
复制代码
如果说,我们只实现了第一个接口的成员,而没有实现第二个接口独有的成员,那么就会报错,如下图所示:
温馨提示: 在上面举例中,我们只实现了第一个接口的成员,忽略了第二个接口的成员,那么系统就会报错,在此提醒小伙伴们千万别忘记一定要实现所有的成员哦!5.一个类可以继承多个接口,但是每个接口的成员必须进行实现:注:在继承多个接口时每个接口之间用","进行连接
举例:
interface INmyface//接口一
{
void Run();
void Say();
void Eat();
void Sleep();
int Age { get ; set; }
void DDD();
}
interface INseconde//接口二
{
void Day();
}
interface INThird//接口三
{
void Sun();
}
class Son : INseconde,INmyface, INThird
{}
//在此举例时就不再次写实现成员的过程了
复制代码
如果忘记了任何一个接口成员时,就会:
五.接口的实现:
前面说了那么多,那接口到底怎样在派生类中进行实现呢?,一般有两种实现形式:
1.隐式实现:
所谓的隐式实现就是对其中的方法等进行重写,举例:
public void DDD()
{
Console.WriteLine("我会打游戏,---来自第一个接口");
}
复制代码
2.显示实现:
显示实现:使用接口名点成员实现,创建一个仅通过该接口调用并且特定于该接口的类成员。这是使用接口名称和一个句点命名该类成员来实现的:类型 接口名称.方法{}
举例,我们在原有接口中对 INseconde 中的方法和 INmyface 中的属性进行显示实现:(因为我们只更改这两个所以只写了这两个)
class Son : INseconde,INmyface, INThird
{
int INmyface.Age
{
get;
set;
}
void INseconde.Day()
{
Console.WriteLine("我是第二个接口中独有的方法");
}
}
复制代码
main 函数中,因为用到了一个全新的概念申明类,这个知识点在下篇文章将会介绍到:
static void Main(string[] args)
{
//Son son = new Son();
//申明类
INmyface nn = new Son();
INseconde nmyface = new Son();
nmyface.Day();
nn.Age = 1;
Console.WriteLine("这是第{0}次了解接口",nn.Age);
Console.ReadLine();
}
复制代码
运行结果:
3.隐式实现与显示实现的区别:
两者最大的区别就在于,隐式实现是接口和类都可以进行访问,显示实现只有接口可以进行访问!
六.使用接口的目的(作用):
1.一个接口内,允许包含变量、常量等一个类所包含的基本内容。但是,接口中的函数不允许设定代码,也就意味着不能把程序入口放到接口里。由上可知,接口是专门被继承的。接口存在的意义也是被继承;2.接口的主要目的是为不相关的类提供通用的处理服务,由于 C#中只允许树形结构中的单继承,即一个类只能继承一个父类,所以接口是让一个类具有两个以上基类的唯一方式;
七.接口应用的详细举例:
interface INmyface//接口一
{
void Run();
void Say();
void Eat();
void Sleep();
int Age { get ; set; }
void DDD();
}
interface INseconde:INFour//接口二
{
void Day();
}
interface INThird//接口三
{
void Sun();
}
interface INFour//接口用于被继承
{
void Sum();
}
class Son : INseconde,INmyface, INThird
{
//1.显示实现
// int INmyface.Age
// {
// get;
// set;
//}
//2.隐式实现
public int Age {
get { return 1; }
set { Age = value; }
}
//1.显示实现
//void INseconde.Day()
//{
// Console.WriteLine("我是第二个接口中独有的方法");
//}
//2.隐式实现
public void Day()//继承接口以后,接口二独有的方法
{
Console.WriteLine("我是第二个接口中独有的方法");
}
public void DDD()
{
Console.WriteLine("我会打游戏,---来自第一个接口");
}
public void Eat()
{
Console.WriteLine("我会吃,---来自第一个接口");
}
public void Run()
{
Console.WriteLine("我会跑---来自第一个接口");
}
public void Say()
{
Console.WriteLine("我会说话---来自第一个接口");
}
public void Sleep()
{
Console.WriteLine("我会睡觉---来自第一个接口");
}
public void Sum()
{
Console.WriteLine("我是用来统计的,---来自接口的继承");
}
public void Sun()
{
Console.WriteLine("今天是晴天,---我来自第三个接口");
}
class Program
{
static void Main(string[] args)
{
Son son = new Son();
INmyface nn = new Son();
INseconde nmyface = new Son();
nmyface.Day();//显示实现
nn.Age = 1;//显示实现
son.Run();
Console.ReadLine();
//son.Say();
//Console.ReadLine();
son.Eat();
Console.ReadLine();
son.Sleep();
Console.ReadLine();
son.Day();
Console.ReadLine();
son.DDD();
Console.ReadLine();
son.Sum();
Console.ReadLine();
son.Sun();
Console.ReadLine();
Console.WriteLine("这是第{0}次了解接口",nn.Age);
//Console.WriteLine("这是第{0}次了解接口",son.Age);
Console.ReadLine();
}
}
复制代码
运行结果:
评论