C#学习笔记系列
第一章 【C#学习笔记】【StackTrace】
第二章 【C#学习笔记】【Attribute】
第三章 【C#学习笔记】【Interface】
文章目录
前言
在C#的编程中,类是我们每天都会接触到的,但是对于初学者来说,接口就比较陌生了,也许入门学习时有学过,但是经过工作实践,部分新人就会发现,基本不会去用到接口,但是看大神源码,又是处处都有影踪,那么接口到底是什么呢?接下来学习接口(Interface)的概念,接口是什么,怎么使用接口,重点是为什么要使用接口。
一、Interface介绍
- 接口定义了所有类继承接口时应遵循的语法合同。接口定义了语法合同“是什么”部分,派生类定义了语法合同“怎么做”部分。
- 接口定义了属性、方法、事件、索引器等,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构。
- 接口使得实现接口的类或结构在形式上保持一致。
- 接口是一个引用类型,通过接口可以实现多重继承。
- 接口中只能声明“抽象”成员,所以不能直接对接口进行实例化,但允许派生出具体的,具有实际功能的类。
- 接口名称一般习惯用大写字母“I”作为开头(不是必须的,但是建议统一这样做增强可维护性)。
- 接口中成员的访问权限默认为public,所以我们在定义接口时不用再为接口成员指定任何访问权限修饰符,否则编译器会报错。
- 接口类一旦被实现(被一个类继承),派生类就必须实现接口中的所有成员,除非派生类本身也是抽象类。
- 接口本身并不实现任何功能,它只是和声明实现该接口的对象订立一个必须实现哪些行为的契约。
- 类只能继承一个基类,但可以继承多个接口。
二、定义接口
2.1. 声明接口
接口使用Interface关键字声明,它与类的声明类似。接口声明默认是public的,也可以显式地声明为public或internal(不能是其他),接口内的成员默认是public,不能显式地添加修饰符,通常接口命令以“I”字母开头:
public interface IMyInterface
{
void MethodToImplement();
}
2.2. 实现接口
2.2.1. 隐式实现
就是对其中的方法等进行重写
public interface IMyInterface
{
void MethodToImplement();
}
public class InterfaceImplementer : IMyInterface
{
public void MethodToImplement()
{
Console.WriteLine("MethodToImplement() called.");
}
}
static void Main()
{
InterfaceImplementer iImp = new InterfaceImplementer();
iImp.MethodToImplement();
}
2.2.2. 显式实现
使用接口名点成员实现,创建一个仅通过该接口调用并且特定于该接口的类成员
public interface IMyInterface
{
void MethodToImplement();
}
public interface ISecond
{
void Day();
}
public interface IThird
{
void Sun();
}
public class InterfaceImplementer : IMyInterface, ISecond, IThird
{
void IMyInterface.MethodToImplement()
{
Console.WriteLine("MethodToImplement() called.");
}
void ISecond.Day()
{
Console.WriteLine("Day() called.");
}
void IThird.Sun()
{
Console.WriteLine("Sun() called.");
}
}
static void Main(string[] args)
{
IMyInterface myInterface = new InterfaceImplementer();
myInterface.MethodToImplement();
ISecond second = new InterfaceImplementer();
second.Day();
IThird third = new InterfaceImplementer();
third.Sun();
}
2.2.3. 区别
两者最大区别是,隐式实现是接口和类都可以进行访问,显式实现只有接口才可以访问。
2.3. 接口继承
在C#中,一个接口可以继承另一个接口,例如可以使用接口 1 继承接口 2,当用某个类来实现接口 1 时,必须同时实现接口 1 和接口 2 中的所有成员。
以下实例IMyInterface 继承了IParentInterface接口,因此接口实现类必须实现MethodToImplement()和ParentInterfaceMethod()方法:
public interface IParentInterface
{
void ParentInterfaceMethod();
}
public interface IMyInterface : IParentInterface
{
void MethodToImplement();
}
public class InterfaceImplementer : IMyInterface
{
static void Main()
{
InterfaceImplementer iImp = new InterfaceImplementer();
iImp.MethodToImplement();
iImp.ParentInterfaceMethod();
}
public void MethodToImplement()
{
Console.WriteLine("MethodToImplement() called.");
}
public void ParentInterfaceMethod()
{
Console.WriteLine("ParentInterfaceMethod() called.");
}
}
三、为什么要使用接口?
1.一个接口内,允许包含变量、常量等一个类所包含的基本内容。但是,接口中的函数不允许设定代码,也就意味着不能把程序入口放到接口里。由上可知,接口是专门被继承的。接口存在的意义也是被继承;
2.接口的主要目的是为不相关的类提供通用的处理服务,由于C#中只允许树形结构中的单继承,即一个类只能继承一个类,但是类可以继承多个接口,所以接口是让一个类具有两个以上基类的唯一方式;
总结
不积硅步,何以至千里