Interface 【接口的使用】 可定义属性,方法,索引器和事件的签名,不可定义字段

发布时间 2024-01-08 14:11:35作者: 爱学习VS

一.接口含义:

       接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同 “是什么” 部分派生类定义了语法合同 "怎么做"部分。通俗来讲就是接口定义了一些行为,继承接口的类应该必须拥有这些行为,按照这些行为去做…【接口定义了大方向的使用部分,比如一天的工作量,第一做什么,第二做什么,第三做什么】【类继承接口后,就要把第一做什么的这个事情给具体化】

二.接口的声明:
接口必须用关键字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.举例:
我们定义了一个接口,并定义了几个接口成员:

 

四.接口的特点:
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();
}
}

运行结果:

八:其它应用场景的接口展现

 九:其他链接

       C#系列之接口介绍_c# 接口-CSDN博客   显隐式调用

       C#接口归纳总结实例详解_c#接口实例-CSDN博客

十:泛型接口具体应用

1>自定义泛型接口

和普通接口一样,一个泛型接口通常也是与某些对象相关的约定规程。泛型接口的声明如下:

interface [接口名]<T>

{

[接口体]

}

在c#中,通过尖括号“<>”将类型参数括起来,表示泛型。声明泛型接口时,与声明一般接口的唯一区别是增加了一个<T>。一般来说,声明泛型接口与声明非泛型接口遵循相同的规则。

泛型接口定义完成之后,就要定义此接口的子类。定义泛型接口的子类有以下两种方法。

(1)直接在子类后声明泛型。

(2)在子类实现的接口中明确的给出泛型类型。