现在的位置: 首页 > 综合 > 正文

接口,抽象类,虚方法,重写(interface,abstract class,virtual function,override)

2013年09月22日 ⁄ 综合 ⁄ 共 1719字 ⁄ 字号 评论关闭
文章目录

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 virtual void 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两个方法.鸟类具有属性,两只脚,有羽毛.有方法飞行,下蛋.则可以定义一个抽象类.

其实只是为了设计的方便,清晰易懂而去做这样的考虑.你如果要把接口和抽象类不做区别的混淆使用,也完全是可以的.只要注意那些细微的语法区别.

抱歉!评论已关闭.