用接口实现多态
接口是完全抽象的一种约定,在C#语言中,接口是声明类具有的方法和成员的的、自身不能被实例化的、只能被继承的特殊类。接口和抽象类的区别是:接口是对一种特定的方法或者一类特定的能力所做的一种抽象,而抽象类是对一类对象的抽象。接口的特点如下:
◆ 接口就是用来实现的,但是接口里面不包含方法的实现体。
◆ 继承接口的任何非抽象类型都必须实现接口的所有成员。
◆ 类和结构可以从多个接口继承。
◆ 接口自身也可以从多个接口继承。
◆ 一个接口可由多个类来实现,,而一个类也可以实现多个接口。
◆ 接口的所有成员默认访问级别为public。
◆ 接口成员只有方法、属性、索引和事件等声明。
接口的声明语法个如下:
[访问修饰符] interface 接口名 [:父接口列表]
{
//接口成员定义体
}
其中,访问修饰符可以是new、public、protected、internal和private。new修饰符是在嵌套接口中唯一被允许的修饰符,表示用相同的名称隐藏一个继承的成员。
类可以通过其继承的基类或接口多次继承某个接口。在这种情况下,如果将该接口声明为新类的一部分,则类只能实现该接口一次。如果没有将接口声明为新类的一部分,其实现将由声明它的基类提供。基类可以使用虚拟成员实现接口成员,在这种情况下,集成接口的类课可通过重写虚拟成员来更改接口行为。
例如:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 接口
{
class Program
{
static void Main(string[] args)
{
IWalk[] walkObj={new Person(),
new Student(),
new Child(),
new Cat(),
new Bicycle()
};
foreach (IWalkitem in walkObj)
{
item.Walk(); //这一个方法实现了多态
}
Console.WriteLine("=================================");
ISound[] soundObj = {new Person(),
new Student(),
new Child(),
new Cat(),
new Radio()
};
foreach (ISounditem in soundObj)
{
item.Sound();
}
Console.ReadKey();
}
}
interface IWalk //定义行走方法的接口
{
void Walk();
}
interface ISound //定义发声方法的接口
{
void Sound();
}
abstract class Animal:IWalk,ISound //继承两个接口表示Animal类有这两个方法
{
public abstract void Walk();
public abstract void Sound();
}
class Person:Animal
{
public override void Walk()
{
Console.WriteLine("我是人,用两条腿走路! ");
}
public override void Sound()
{
Console.WriteLine("我会用人的语言说话!!! ");
}
}
class Student: Person
{
public sealed override voidWalk() //用sealed修饰表示禁止Student子类重写该方法
{
Console.WriteLine("我是学生,这是我重写的走路方法~~~");
}
public override void Sound()
{
Console.WriteLine("我是学生,这是我重写的发声方法^_^");
}
}
class Child : Student
{
public override void Sound()
{
Console.WriteLine("我是小孩,我的声音很好听哦0_0");
}
public voidWalk() //Student中的Walk不能被重写
{
//此处未定义方法体,则会继承Student类对应的方法体
}
}
class Cat:Animal
{
public override void Walk()
{
Console.WriteLine("我是猫,我走猫步@_@");
}
public override void Sound()
{
Console.WriteLine("我是猫,喵喵喵~~~");
}
}
class Bicycle:IWalk //自行车只有移动的能力,只继承移动的接口
{
public void Walk()
{
Console.WriteLine("我是自行车,我会移动哦……");
}
}
class Radio : ISound //收音机只有发声的能力,只继承发声的接口
{
public void Sound()
{
Console.WriteLine("小喇叭又开始广播啦!!! ");
}
}
}
程序运行结果如下: