目录
接口
1.接口
1.1 声明接口
1.2 实现接口&调用接口
1.2.1 显式接口实现方式
1.2.2 显式接口实现&隐式接口实现的使用场景
1.3 as运算符
2.接口继承接口
接口
1.接口
接口的意义:C#的继承不支持一个子类拥有多个父类。而接口的存在就是为了弥补这一缺点,接口允许一个类拥有多个接口。正因有接口的存在,C#不仅有面向对象的编程,还有面向接口的编程。
接口的定义:声明一组函数成员而不实现它们的引用类型。接口可以被继承,继承该接口的类或结构可以实现这些方法。
创建接口的步骤:
- 第一步:新建项。右击解决方案,点击添加,新建项,然后创建一个新的控制台应用,并命名为CustomInterface
- 第二步:创建接口文件。右击CustomInterface项目,添加,新建项,选择接口。
1.1 声明接口
声明接口的语法: interface 接口名 {...}
示例:
interface IAdd
{
int Add(int a,int b);//声明方法
}
接口命名规范:接口名是前面要加一个大写的I。其含义是Interface的缩写,在编码时,方便我们知道它代表接口。
使用接口的要求 :
- 接口可以使用访问修饰符。
- 在接口中定义的方法不需要添加修饰符,默认为public。
- 接口可以只能包含非静态的方法、属性、事件、索引器。
- 但不能包含静态成员、字段、运算符重载、实例构造函数、析构函数。
- 接口中存放的是方法的声明,并没有存放方法的定义。接口的声明中分号代替了方法块
- 值得注意的是,接口无法实例化。
1.2 实现接口&调用接口
继承接口的语法: public class 类名:接口名1,接口名2{...}
实现接口的要求:
- 必须实现接口中所有的成员
- 基类列表有接口的名字
示例:
internal interface IAdd
{
//声明方法
int Add(int a,int b);
}
public class Count:IAdd
{
private int a=10;
public int A
{
set{a=value;}
get{return a;}
}
//隐式接口实现方法
public int Add(int x,int y=10)
{
return x+y;
}
}
class Program
{
static void Main(string[] args)
{
Count one = new Count();
Console.WriteLine("两数相加和为{0}",one.Add(10));
}
}
1.2.1 显式接口实现方式
显式接口的意义:解决一个类在继承不同接口时,接口中方法命名冲突的问腿。
隐式接口实现方式:在实现接口方法的时候,没有明确指明实现哪个接口中的方法。(因为接口可以继承多个,不可避免有些接口的方法中标签和返回类型都相同,即方法名、参数)
显式接口实现方式:明确指明是实现哪个接口中的方法。
显式接口实现的语法:
返回类型 接口名.方法名(参数){...}
使用显式接口的要求:
- 显式实现的成员固定为是私有的。不能使用访问修饰符
- 显式实现的成员不能被类对象访问。
- 要访问显式实现的成员,需要将继承类的实例对象显式转换为对应的接口类型,并通过接口来调用成员。
实例:
//接口的声明
internal interface IChinese
{
void SayHello();//声明方法
}
internal interface IAmerican
{
void SayHello();//声明方法
}
//接口的实现
public class Speaker:IChinese, IAmerican
{
//显式接口的实现
void IChinese.SayHello() { Console.WriteLine("你好"); }
void IAmerican.SayHello() { Console.WriteLine("Hello"); }
//隐式接口的实现
public void SayHello() { Console.WriteLine("你好丫hello"); }
}
//接口的调用
class Program
{
static void Main(string[] args)
{
Speaker speaker = new Speaker();
speaker.SayHello();
//显式地转化为通过IAmerican接口来调用SayHello方法
IAmerican american = (IAmerican)speaker;
american.SayHello();
IChinese chinese = (IChinese)speaker;
chinese.SayHello();
}
}
1.2.2 显式接口实现&隐式接口实现的使用场景
- 采用隐式接口实现:类和接口都可以访问接口中的成员。
- 实现单个接口
- 采用显式接口实现:只能通过接口访问接口中的成员。
- 实现多个接口。特别是接口中包含相同的标签和返回类型的情况。
1.3 as运算符
as运算符的意义:通过显式接口的实现,我们知道可以通过强制转换类型来调用接口的方法。而as的存在,就是另一个更好调用接口成员的方法。我们
as运算符的定义:可以通过as运算符来避免将类实例对象强制转换为未实现成员的接口类型时,报错的问题。
as运算符的语法:
接口名 变量名 = 类实例对象 as 接口名
示例:
IAdd a = b as IAdd;
as运算符的使用要求:
- 如果类实现了接口,则返回指向接口的引用。
- 如果类没有实现接口,则返回null而不抛出异常。
2.接口继承接口
接口继承接口的定义:接口不仅可以被类或结构继承,还可以被一个或多个接口继承。
接口继承接口的语法:
interface 接口:接口1,接口2...{...}
接口继承接口的要求:
- 派生接口拥有它本身成员和基接口的所有成员。