Virtual方法(虚方法)和Abstract方法(抽象方法)

一、Virtual方法(虚方法)

virtual 关键字用于在基类中修饰方法。virtual的使用会有两种情况:
情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法。那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法。
情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法。那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法。

当一个方法被声明为Virtual时,它是一个虚拟方法,直到你使用ClassName variable = new ClassName();声明一个类的实例之前,它都不存在于真实的内存空间中。这个关键字在类的继承中非常常用,用来提供类方法的多态性支持。

二、Abstract方法(抽象方法)
abstract关键字只能用在抽象类中修饰方法,并且没有具体的实现。抽象方法的实现必须在派生类中使用override关键字来实现。

抽象方法声明使用,是必须被派生类覆写的方法,抽象类就是用来被继承的;可以看成是没有实现体的虚方法;如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其他一般方法;抽象类不能有实体的。

三、多态

C#中多态的实现分为了两种,一种是编译时多态,一种是运行时多态

|- 编译时多态 通过一个类中多个方法的重载来实现的多态,系统在编译的时候,根据传递的参数确定具体调用哪个重载的方法;

|- 运行时多态 通过virtual函数(虚函数)、抽象方法实现的多态,派生类去override虚函数或抽象方法,从而实现运行时多态.

四、abstract的用法

类文件:

public abstract class book

{

//抽象方法,不含主体,抽象方法所在类必须为抽象类,派生类必须实现该方法

public abstract string In();

}

public class JavaBook : book

{

String str = null;

public JavaBook() { }

public JavaBook(String str)

{

this.str = str;

}        //实现抽象方法,必须实现,注意!必须添加override关键字

public override string In()

{

return "zhaojianwei: "+str;

}

}

public class NETBOOK : book

{

String str = null;

public NETBOOK()

{

}

public NETBOOK(String str)

{

this.str = str;

}

//实现抽象方法,必须实现,注意!必须添加override关键字

public override string In()

{

return "Fullbuster: "+str;

}

}

主页面:

public class text

{

public string zext()

{

//NETBOOK nb = new NETBOOK();

//return  nb.In();  //调用

book bk = new NETBOOK("sheng");

book bk1 = new NETBOOK("zhao");

return bk.In();    //调用

}

}

public partial class Default : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

text T = new text();

Response.Write(T.zext());

}

}

五、virtual的用法以及override的用法

类文件:

public  class Anime

{

public virtual string AB()

{

return "Angel Beats";

}

public virtual string SAO()

{

return "Sword Art Online";

}

}

public class A:Anime

{

public override string AB()

{

return "奏で";

}

//此方法没有被重写

public string SAO()

{

return "Link Start!";

}

}    
主页面:

public class text

{

public string aext()

{

// A anime1 = new A();

// return anime1.AB() + anime1.SAO();

Anime anime = new A();

return anime.AB()+anime.SAO();

}

public partial class Default : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

text T = new text();

Response.Write(T.aext() + "<br/>");

}

}

六、virtual和abstract的区别慨括

(1)、virtual修饰的方法必须有实现(哪怕是仅仅添加一对大括号),而abstract修饰的方法一定不能实现。

(2)、virtual可以被子类重写,而abstract必须被子类重写,如果重写了virtual修饰的方法,前面必须添加override(这样就告诉了编译器你要重写虚拟方法),而且必须有实现,否则编译出错;

(3)、如果类成员被abstract修饰,则该类前必须添加abstract,因为只有抽象类才可以有抽象方法。

(4)、无法创建abstract类的实例,只能被继承无法实例化,比如: BaseTest2 base2 = new BaseTest2();将出现编译错误:抽象类或接口不能创建实例。

(5)、C#中如果要在子类中重写方法,必须在父类方法前加virtual,在子类方法前添加override,这样就避免了程序员在子类中不小心重写了父类方法。

(6)、abstract方法必须重写,virtual方法必须有实现(即便它是在abstract类中定义的方法).

时间: 2024-10-12 12:34:04

Virtual方法(虚方法)和Abstract方法(抽象方法)的相关文章

virtual方法和abstract方法

在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法. 情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法.那么在对派生

virtual方法和abstract方法的使用(轉載)

在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法. 情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法.那么在对派生

C#中virtual(虚方法)的理解以及和abstract(抽象方法)的区别

Virtual方法(虚方法) virtual 关键字用于在基类中修饰方法.virtual的使用会有两种情况: 情况1:在基类中定义了virtual方法,但在派生类中没有重写该虚方法.那么在对派生类实例的调用中,该虚方法使用的是基类定义的方法. 情况2:在基类中定义了virtual方法,然后在派生类中使用override重写该方法.那么在对派生类实例的调用中,该虚方法使用的是派生重写的方法. 代码如下: namespace VirtualTestApplication{ public class

C#基础知识:virtual方法,abstract方法,区别

virtual 关键字用于修饰方法.属性.索引器或事件声明,并使它们可以在派生类中被重写.默认情况下,类中的方法是非虚的,非虚的方法不能在子类中被覆盖(override),但是可以隐藏(new),但这不影响父类方法的功能.为了达到子类以自己的方法实现某一功能的目的,需要在父类中用virtual关键字来修饰方法,这样,在其继承子类中就可以采用覆盖的方法来提供方法的多态机制.virtual关键字在类中修饰方法需要注意以下几点: 1. virtual修饰类中方法时,前面必须有public修饰符,非虚方

抽象类和抽象方法 abstract类和abstract方法

可以使用abstract来修饰一个类或者方法. 用abstract修饰的类表示这个类是一个抽象类,用abstract修饰的方法表示这个方法是一个抽象方法. 抽象类不能被实例化. 抽象方法是只有方法声明,而没有方法的实现内容. 一个类中,只要有一个抽象方法,这个类必须被声明为抽象类抽象方法在非抽象子类中必须被重写.重写了这两个方法,虽然方法体里面 {} 的内容是空的,也算重写了这个方法.注意看重写方法的参数名称,这里只要参数数量一致就可以,不要求参数的名称必须一致. 一个类中,只要有一个抽象方法,

C#中interface、virtual和abstract方法的区别

Abstract: abstract方法必须在abstarct类中声明,没有默认实现,子类必须实现. Virtual: virtual方法可以声明在abstract类中,也可以声明在非abstarct类中,并且可以有默认实现. Interface: 最重要的就是类可以继承自多个Interface.

c++虚函数的使用方法

虚函数的使用方法: (1)在基类用virtual声明成员函数为虚函数.这样就可以在派生类中重新定义此函数,为它赋予新的功能,并能方便被调用. 在类外定义虚函数时,不必在定义virtual (2)在派生类中重新定义此函数,要求函数名,函数类型,函数参数个数和类型全部与基类的虚函数相同,并根据派 生类的需要重新定义函数体. c++规定,当一个成员函数被声明为虚函数后,其派生类的同名函数都自动成为虚函数.因此在派生类重新声明该 虚函数时,可以加virtual,也可以不加,但习惯上一般在每层声明该函数时

创建一个接口Shape,其中有抽象方法area,类Circle 、Rectangle实现area方法计算其面积并返回。又有Star实现Shape的area方法,其返回值是0,Star类另有一返回值boolean型方法isStar;在main方法里创建一个Vector,根据随机数的不同向其中加入Shape的不同子类对象(如是1,生成Circle对象;如是2,生成Rectangle对象;如是3,生成S

题目补充: 创建一个接口Shape,其中有抽象方法area,类Circle .Rectangle实现area方法计算其面积并返回. 又有Star实现Shape的area方法,其返回值是0,Star类另有一返回值boolean型方法isStar: 在main方法里创建一个Vector,根据随机数的不同向其中加入Shape的不同子类对象(如是1,生成Circle对象: 如是2,生成Rectangle对象:如是3,生成Star对象).然后将Vector中元素依次取出,判断其是否为Star类.如是返回其

虚方法与两种重写方法的比较

虚方法virtual..override: 1.派生类的方法和基类的方法有相同的签名和返回类型. 2.基类的方法使用virtual标注. 3.派生类的方法使用override标注. class MyBaseClass { virtual pubilc void Print() ... } class MyDerivedClass : MyBaseClass { override pubilc void Print() ... } 注意: 1.重写和被重写的方法必须有相同的可访问性.换一种说法,被