抽象(abstract)
abstract是C#关键字,用于修饰类和方法,被abstract修饰的类和方法被叫做抽象类和抽象方法。
抽象类
特点
- 不能被实例化。
- 继承抽象类必须重写所有抽象方法。
- 可以包含抽象方法。
语法格式
abstract class Thing //abstract class 类名
{
//成员变量
//成员函数
//其他
}
抽象方法
特点
- 只能写在抽象类中。
- 只能定义,没有方法体。
- 继承类需要使用override重写。
语法格式
public abstract void Speak(); //访问修饰符 abstract 返回值类型 方法名(参数列表);
用法
//定义抽象类
abstract class Human
{
public string name;
public int age;
public bool boy;
public abstract void Speak(string name);
}
//继承抽象类
class Chinese:Human
{
//重写抽象方法
public override void Speak(string name)
{
Console.WriteLine("我的名字是{0}",name);
}
}
static void Main(string[],args)
{
Chinese person1 = new Chinese();
person1.name = "李白";
person1.Speak(person1.name);//输出 我的名字是李白
}
作用
定义类的规范。
接口(interface)
特点
- 接口不能被实例化,但遵循里氏替换原则,可以作为引用。
- 接口不可继承类,但可以继承其它接口,接口继承接口不需要实现,需要在继承接口的类中实现。
- 接口中不包含成员变量,只包含方法,属性,索引器,事件。
- 接口中的成员只声明不实现。
- 继承接口的类必须实现类中的所有成员。
- 接口命名通常首字母为I。
- 类中可以定义接口(内部接口),定义了内部接口的类不可实例化。外部的类可以通过 类名.接口名继承该接口。
- 接口中的成员默认是public,且一般都是声明为public
语法格式
interface IFly //interface 接口名
{
public void Fly(); //定义成员函数,不能实现,默认是public
string Name //成员属性
{
get;
set;
}
int this[int index] //索引器
{
get;
set;
}
event Action doSomething; //事件
}
使用
interface IFly
{
public void Fly();
}
interface IEat
{
public void Eat();
}
//创建一个类继承接口IFly,接口IEat
class Animal
{
public void Fly() //实现IFly接口中的public方法
{
Console.WriteLine("我能飞");
}
public virtual void Eat() //实现接口IEat中的public方法,并且设置为虚函数,可在子类中重写
{
Console.WriteLine("我能吃");
}
}
//创建一个类继承类Animal
class Bird:Animal
{
public override void Eat()
{
base
Console.WriteLine("我能吃");
}
}
显式实现接口
当类继承一个接口中含有pretect类型成员(几乎不存在这种情况),或者继承两个接口中有同名成员,需要去显式实现这些方法。接口作为引用。
interface IWalk
{
public void Move();
}
interface IRun
{
public void Move(float speed);
}
class Animal:IWalk,IRun
{
public void IWalk.Move()
{
Console.WriteLine("走动");
}
public void IRun.Move(float speed)
{
Console.WriteLine("跑动,以{0}速度",speed);
}
}
static void Main(string[],args)
{
Animal ani = new Animal();
//ani中没有Move方法,需要转换成IWalk,IRun才可调用对用的方法
//接口IWalk作为引用
(ani as IWalk).Move()//输出 走动
//接口IRun作为引用
IRun ani2 = new Animal();
ani2.Move(10.0)//输出 跑动,以10.0速度
}
作用
- 定义方法的规则,通常用来定义某一种功能使用。
- 用于多重继承。(C#类不能多重继承)。
抽象类和接口的区别
抽象类和接口都是用于对编程定义一种规范,它们本身是不能被实例化,需要被其他的类继承并且实现它门所定义的方法。
两者看起来很相似,它们也有些区别
抽象类是类,需要遵守类的规则。可以继承其他类,可以被其他类继承,不能多重继承(同时继承多个类)。接口则可以实现多重继承(类可以多重继承接口,接口可以多重继承其他接口,但接口不能继承类,类也不能多重继承其他类)。