一、抽象类
抽象类(abstract)是一个特殊的类,不能被实例化,抽象类中一般包括抽象方法与普通方法,抽象类和抽象方法用abstract进行修饰,抽象类一般当做父类进行使用,子类如果继承抽象类,其子类就必须使用override进行重写。如果子类继承抽象类就必须实现抽象类中的功能。
抽象类的的语法形式:
访问修饰符 abstract class 抽象类名()
{
类成员(普通方法、抽象方法等);
}
抽象方法的语法形式:
访问修饰符 abstract 返回值 抽象方法名();
子类重写抽象方法:
访问修饰符 override 返回值 抽象方法名()
{
方法体;
}
抽象方法不做功能实现,功能由它的子类进行实现。
案例分析:
抽象类中可以将抽象方法和普通方法进行封装,其中Dog类继承自Animal类,既能够继承Animal中的Run()方法也能够继承抽象方法Eat(),因为Eat()是抽象方法,所以在Dog类中要对Eat()方法进行重写。
public abstract class Animal
{
public abstract void Eat();
public void Run()
{
Console.WriteLine("跑");
}
}
public class Dog():Animal
{
public override void Eat()
{
Console.WriteLine("肉");
}
}
抽象类的特点:
1.不能被实例化。
2.抽象类和抽象方法必须使用abstract进行修饰。
3.子类必须使用override进行抽象方法的重写
4.抽象方法不能对其功能进行实现。
5.其子类必须实现抽象方法中的功能。
二、接口
接口(interface)只进行方法的声明,不实现具体功能。接口也同样不能被实例化,接口的设计就是规定了此程序必须要有哪些功能,由使用者来进行方法的实现,从而保证了其功能的完整性。接口不能使用访问修饰符,接口默认访问修饰符就为public,因为接口的设计就是为了让子类继承。接口的命名方式一般用“I”作为首字母。
接口的语法形式:
interface I接口名
{
接口成员;
}
案例分析:
接口Itest中存在Run()和Eat()两个方法,现有Animal类继承Itest这个接口,就必须对这两个方法进行具体实现,可以说接口相当于一种规范,避免在写代码的过程中造成功能的缺失。
internal class Animal:Itest
{
static void Main(string[] args)
{
Animal animal = new Animal();
animal.Run();
animal.Eat();
}
public void Run()//对接口中的方法进行实现
{
Console.WriteLine("跑");
}
public void Eat()//对接口中的方法进行实现
{
Console.WriteLine("吃");
}
}
interface Itest
{
void Run();
void Eat();
}
接口继承:接口和类一样可以实现多层成,接口可以继承接口。
案例分析:
接口Itest1继承Itest,所以Animal继承Itest1接口时,同样要实现接口Itest中的Eat()方法进行实现。
internal class Animal:Itest1
{
static void Main(string[] args)
{
Animal animal = new Animal();
animal.Run();
animal.Eat();
}
public void Run()
{
Console.WriteLine("跑");
}
public void Eat()
{
Console.WriteLine("吃");
}
}
interface Itest
{
void Eat();
}
interface Itest1:Itest
{
void Run();
}
三、抽象类与接口的区别
1、抽象类中可以使用具体实现的方法,而接口中只能进行方法的声明;
2、抽象方法要用sbstract进行修饰,通过override进行重写,而接口不要使用访问修饰符,默认为 public;
3、抽象类只能实现单继承,而接口可以实现多继承。
4、抽象类可以包含定义好的方法以及字段,接口只能包含方法的声明不能包含字段。