接口是什么和如何定义接口
**接口的定义是指定一组函数成员而不实现成员的引用类型,其它类型和接口可以继承接口。
接口使用 interface 关键字声明,它与类的声明类似。接口声明默认是 public 的。如:
//interface Ijiekou
{
void Apple();
}
接口本身并不实现任何功能,它只是和声明实现该接口的对象订立一个必须实现哪些行为的契约。例如:
// using System;
namespace Hutao
{
interface Ijiekou
{
void Apple();
}
class Keqin:Ijiekou
{
static void Main(String[] args)
{
Keqin keqin = new Keqin();
keqin.Apple();
}
public void Apple()
{
Console.WriteLine("接口");
}
}
}
结果为:
若不实现"行为的契约",如:
// using System;
namespace Hutao
{
interface Ijiekou
{
void Apple();
}
class Keqin:Ijiekou
{
static void Main(String[] args)
{
Keqin keqin = new Keqin();
}
}
}
则会出现以下的报错:
接口的特点
1)通过接口可以实现多重继承,C# 接口的成员不能有 public、protected、internal、private 等修饰符。原因很简单,接口里面的方法都需要由外面接口实现去实现方法体,
那么其修饰符必然是 public。C# 接口中的成员默认是 public 的,java 中是可以加 public 的。
(2)接口成员不能有 new、static、abstract、override、virtual 修饰符。有一点要注意,
当一个接口实现一个接口,这2个接口中有相同的方法时,可用 new 关键字隐藏父接口中的方法。
(3)接口中只包含成员的签名,接口没有构造函数,所以不能直接使用 new 对接口进行实例化。接口中只能包含方法、属性、事件和索引的组合。
接口一旦被实现,实现类必须实现接口中的所有成员,除非实现类本身是抽象类。
(4)C# 是单继承,接口是解决 C# 里面类可以同时继承多个基类的问题。
下面举一个多继承的例子:
// class Program
{
static void Main(string[] args)
{
IWorker james1 = new James1();
IWorker james2 = new James2();
james1.work("设计");
james2.work("编程");
//从这个例子我体会到了有接口的好处,可以想象如果又来了新的员工。
//如果不采用接口,而是每个员工都有一个单独的类,这样就会容易出错。
//如果有接口这种协议约束的话,那么只要实现了接口就肯定有接口里声明的方法,我们只需拿来调用。
}
}
public interface IWorker{ void work(string s); }
class James1 : IWorker
{
public void work(string s)
{
Console.WriteLine("我的名字是James1,我的工作是" +s);
}
}
class James2 : IWorker
{
public void work(string s)
{
Console.WriteLine("我的名字是James2,我的工作是"+s);
}
}
接口与抽象类的共同点和不同点
接口和抽象类的共同点:
1.都可以被继承。
2.都不能被直接实例化。
3.都可以包含方法的声明。
接口和抽象类的不同点:
1.接口的子类必须实现所有声明的方法,抽象类的子类必须实现所有的抽象方法(必须是共有的),普通方法可不实现。
2.接口不能包含成员变量,抽象类可包含成员变量。
3.接口不能包含构造函数,抽象类可包含构造函数。
4.接口可以多继承,抽象类只能单继承。
5.接口方法声明默认为public,抽象类可以由其他访问修饰符修饰。