接口的概念
接口interface在语法上类似于抽象类(abstract class),它定义了若干抽象方法、属性、索引器、事件,形成一个抽象成员的集合,每个成员通常反映事物某方面的功能。接口在本质上是对某方面功能或特征的约定。
在程序中使用接口的一个重要作用是,可以帮助实现类似于类的多重继承的功能。(C#不支持多重继承,即一个子类不可以有一个或一个以上的直接父类。)
我们可以把接口理解为“形容词/副词”,类是“名词”,方法是“动词”。
比如,
class:飞机、鸟、超人
interface:会飞的
这三类属于不同的“东西”,但他们都有一个共同特点是“会飞”,如果直接将“飞”这个动作写进class中,我们就要写三次。然而,又不能让他们继承一个叫“会飞的东西”的类,因为他们的不同点才是占多数的,这么做是因小失大。
因此,我们构建一个接口(interface),叫做“会飞的”,他们三个都可以接入这个“形容词”,从而避免了代码冗余。
程序中接口的用处主要体现在以下几个方面:
- 通过接口可以实现不相关类的相同行为,而不需要考虑他们的层次关系。
- 通过接口可以知名多个类需要实现的方法。
- 通过接口可以了解对象的交互界面,而不需要了解对象所对应的类。
接口的定义
格式:
修饰符 interface 接口名{…}
- 子接口将继承所有父接口中的属性和方法。也可以利用new来隐藏父接口中的成员。
- 多个接口,用逗号隔开。父类放在第一位。
- 抽象类实现接口时,也要求为所有成员提供实现程序,抽象类可以把接口方法映射到抽象方法中。
interface IRunnable
{
void run();
}
interface ISwimmable
{
void swim();
}
abstract class Animal
{
abstract public void eat();
}
public class Person : Animal, IRunnable, ISwimmable
{
public void run()
{
Console.WriteLine("run");
}
public void swim()
{
Console.WriteLine("swim");
}
public override void eat()
{
Console.WriteLine("eat");
}
public void study()
{
Console.WriteLine("study");
}
}