1.抽象类和虚方法的区别(abstract,virtual function)
看到抽象和虚这两词真的觉得有点抽象,有点犯迷糊.其实这两者还是很容易区分的.
1.abstract可以修饰class和class中的成员.而且必须是class被abstract修饰了,里面的成员才能被abstract修饰.而virtual不能用来修饰class.只能用来修饰其中的成员.virtual可用于一般的class中,也可用于被abstract修饰的抽象类中.
2.抽象类不能被实例化.例如定义一个抽象类abstract class Dosomething() { };你这样去用肯定不行:Dosomething do = new Dosomething();
抽象类必须被继承并重写了其中的抽象方法才能被实例化.抽象方法里面是啥都没有的.只有个方法的定义在那,不能在里面去实现任何功能,然后必须在继承的子类中重写了才能用.而virtual方法不能只是个定义必须要实现.在继承的子类中可以被重写然后再用,也可以不重写直接用,用法和一般方法一样
2.为啥要搞个搞抽象类,抽象方法和虚方法出来呢?
虚方法和抽象方法可以用来实现多态,抽象类是实现和接口类似的功能.
一.首先说下多态吧.
我们知道面向对象的最主要的三个特性就是封装,继承,多态.多态简单的说就是通过继承创建的多个class,调用相同的方法(即返回类型,方法名,参数列表都相同.)实现了不同的功能.它是通过在继承中重写(override)相同的方法实现的.
另外有个词叫重载,那是指只参数名字相同.参数列表必须不同.
举个多态的简单例子吧:
//基类:
public class Person
{
public virtualvoid Do()
{
Console.WriteLine("Do something");
}
}
//继承的类:
public class Cheater:Person
{
public override void Do()
{
Console.WriteLine("Go to take money from some fools");
}
}
public class Killer:Person
{
public override void Do()
{
Console.WriteLine("Go to kill somebody");
}
}
Class PersonDo--测试类
{
Static void Main(string[] args)
{
Person cheater = new Cheater();
cheater.Do();
Person killer = new Killer();
killer.Do();
}
}
--结果为:Go to take money from some fools
-- Go to kill somebody
我们也可以把基类改成抽象类,继承子类不变.运行结果跟上面一样.
public abstract class Person
{
public abstract void Do();
}
二.抽象类和接口的区别:
接口与抽象类有些相同的地方:
1.不能实例化 2.具有没有实现的方法.3.只有被继承的子类实现了没实现的方法才能实例化
不同点:
1.抽象类也是一种特殊的类.所有也只能单继承.接口则可以多继承
2.接口中的方法不能被public,private等修饰符修饰.它默认是为public.
3.接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员
4.接口中的方法都不能实现.而抽象类可以实现一部分方法或者全部实现.就跟一般的class一样.
抽象类体现的是类的概念,是某一类事物的抽象,有该类事物的属性,及各种方法.而接口主要是某一组共同操作的集合.比如动物都有sleep,eat的方法.则可以定义一个接口,有sleep,eat两个方法.鸟类具有属性,两只脚,有羽毛.有方法飞行,下蛋.则可以定义一个抽象类.
其实只是为了设计的方便,清晰易懂而去做这样的考虑.你如果要把接口和抽象类不做区别的混淆使用,也完全是可以的.只要注意那些细微的语法区别.