接口用来实现多态,接口有几个特性,诸如:不能有访问修饰符,默认public,接口中无法定义实现。
一、接口的实现——显示实现(将方法使用接口.方法/属性这种形式标记出来)
interface IFly
{
void Fly();
int Age { get; set; }
}
class Dog : IFly
{
void IFly.Fly()
{
Console.WriteLine("dog无法飞");
}
int IFly.Age { get; set; }
}
调用如下:
可以使用接口对象调用
IFly fly = new Dog();
fly.Fly();
不能使用实现类对象调用
不允许的调用方式
Dog fly = new Dog();
fly.Fly();//会报错
二、接口的实现——隐式的实现
interface IFly
{
void Fly();
int Age { get; set; }
}
class Dog : IFly
{
public void Fly()
{
Console.WriteLine("dog无法飞");
}
public int Age { get; set; }
}
调用如下:
可以使用接口对象调用,这样做的好处是,如果接口中有一些成员忘记了定义,我们需要在实现类中添加的话,则隐式实现地方式让我们可以调用实现类中成员,这一点显示实现的接口无法满足需求。
IFly fly = new Dog();
fly.Fly();
也可以使用实现类对象调用
Dog fly = new Dog();
fly.Fly();
三、接口和实现类之间的转换
1)实现类隐式转换为接口
Dog fly = new Dog();
IFly iFly = fly;
2)接口要强制显示转换为实现类
IFly iFly = new Dog();
Dog dog = (Dog)iFly;
四、接口继承
一个接口可从另一个接口派生
interface IFly
{
void Fly();
int Age { get; set; }
}
interface IFastFly:IFly
{
void FastFly();
}
class Dog : IFastFly
{
public void Fly()
{
Console.WriteLine("dog无法飞");
}
public void FastFly()
{
Console.WriteLine("狗不能快速的飞");
}
public int Age { get; set; }
}
接口的继承和类继承一样,
五、多接口继承(一个接口可以继承多个接口)
interface IFly
{
void Fly();
int Age { get; set; }
}
interface IEat
{
void Eat();
}
interface IFastFly : IFly, IEat
{
void FastFly();
}
class Dog : IFastFly
{
public void Fly()
{
Console.WriteLine("dog无法飞");
}
public void FastFly()
{
Console.WriteLine("狗不能快速的飞");
}
public void Eat()
{
Console.WriteLine("狗能吃!");
}
public int Age { get; set; }
}
六、接口上的扩展方法
interface IFly
{
void Fly();
int Age { get; set; }
}
static class Extend
{
public static void Run(this IFly fly)//扩展方法
{
Console.WriteLine("狗会跑");
}
}
class Dog : IFly//实现类
{
public void Fly()
{
Console.WriteLine("dog无法飞");
}
public int Age { get; set; }
}
调用如下:
IFly iFly = new Dog();
iFly.Run();
七、通过接口实现多继承
interface IFly
{
void Fly();
}
class Drink
{
}
class Dog : IFly
{
public void Fly()
{
Console.WriteLine("dog无法飞");
}
}
class Animal : Drink, IFly
{
private Dog dog;//聚合
public Animal ()
{
dog = new Dog();
}
public void Fly()
{
dog.Fly();
}
}
调用:
Animal animal = new Animal();
animal.Fly();
八、版本控制
不要为已经交付的接口添加成员,而是直接派生一个新的接口c