C#抽象方法和虚拟方法理解

http://www.cnblogs.com/denylau/archive/2010/04/11/1709573.html

http://www.cnblogs.com/naariah/archive/2011/07/13/2105255.html

http://www.cnblogs.com/kdalan/archive/2012/05/29/2523470.html

http://www.cnblogs.com/lykbk/archive/2012/06/01/lyk19900723_daima3.html

http://www.cnblogs.com/qq4004229/archive/2012/10/23/2735477.html

首先在C#中虚方法的定义:

public virtual void VirtualMethod(){......};

只要在方法名前加上virtual,就声明了该方法为虚方法,注意声明为虚方法后再不能加上abstract,static关键字声明

以下是插入一个实例来说明虚方法与非虚方法的不同

public class A
        {
            public virtual void VirMethod()
            {
                Console.WriteLine("Virtual Method A");
            }
            public void NormalMethod()
            {
                Console.WriteLine("Normal Method A");
            }
       
        }
        public class B : A
        {
            public override void VirMethod()
            {

Console.WriteLine("Virtual Method B");
            }
            public new void NormalMethod()
            {
                Console.WriteLine("Normal Method B");
            }
        }

在main函数中执行:

B b = new B();
            A a = b;//将派生类的实例赋给基类的对象

a.VirMethod();
            a.NormalMethod();
            b.VirMethod();
            b.NormalMethod();
            Console.ReadKey();

执行结果:Virtual Method B

Normal Method A

Virtual Method B

Normal Method B

通过结果表示 a.VirMethod() 虚方法是执行了B类的重写的方法;

a.NormalMethod();非虚方法还是执行了A类本身的方法;

A a = b 这步操作是通过派生类的实例来构造基类的对象,基类指针实际上是指向派生类的对象;所以a.VirMethod()这一步调用的是派生类重写了的方法。

而a.NormalMethod() 还是调用基类的方法

(在这里插下:override是重写了基类的虚方法,new 是新创建一个方法,就是与基类同名而已,但还是子类的自已的方法)

override是重载(有的翻译为覆盖),new是隐藏。

再补充一下:A a = b; 其中A是声明类,B是实例类

在调用函数的时候,系统是先去看声明类,如果函数不是虚函数,就直接调用声明类的,如果是虚函数,它会转去检查对象的实例类.(个人觉得挺有道理的)

如果继承是面向对象设计理论的基石,那么抽象理论和方法就是继承理论的顶梁柱。在汉语词典中抽象是这样解释的:将几个有区别的物体的共同特性或形象抽取出来或孤立地进行考虑的行动或过程。可以看出,抽象就是从事物中提取特征和性质,并不是事物本身。具体应该如何理解呢?

大家都知道,学生有一个共同的特征是必须学习,那么学什么,如何学,每一个学生就不一样了。这样可以提取学习这个动作为抽象方法,而不考虑具体内容。动物类都有叫的动作,具体动物如何叫,暂不考虑,先把共性提取出来。简单地说,用来描述这些共性的类就是抽象类,抽象类中不考虑具体实现,只确定必须具有的行为,就是抽象方法。

抽象方法是一个没有实现的方法,使用关键字abstract定义抽象方法。语法如下:

<访问修饰符> abstract 返回类型 方法();

例如:
public abstract void Cry();

当一个实例方法声明中含有abstract修饰符时,称之为抽象方法(abstract methods)。抽象方法只允许在抽象类中声明,但是并不能实现,抽象方法声明中只包含方法的签名,抽象方法在其派生类中使用override关键字来重写。在抽象方法声明中,不允许出现static、virtual或override中的任一修饰符。

注意:和普通方法不同,抽象方法没有闭合大括号,在方法括号后面直接加“;”号,表明抽象方法中没有方法体,即没有具体的实现。

时间: 2024-08-24 08:13:25

C#抽象方法和虚拟方法理解的相关文章

C#中抽象方法与虚拟方法的区别

学过C#的人应该都知道抽象方法与虚拟方法,而很多初学者对二者之间的区别并不是很了解.今天本文就来分析一下二者之间的区别.并附上实例加以说明.具体分析如下: 一.主要区别: 对于抽象方法,子类必须实现它 . 对于虚拟方法,子类可以重写也可以不重写 . 因此, 两者约束不同 二.实例代码如下: /* 声明一个抽象类 * 1.抽象类中可以包含变量 * 2.抽象方法中无法声明方法体 */ abstract class AbsClass { string name; public abstract voi

虚方法的重写与普通方法的隐藏的区别;抽象方法和虚方法有什么区别?

两者都可实现对基类方法的重写 ,虚方法在基类中virtual ,在派生类用override关键字修饰,而普通方法的隐藏在基类不用什么修饰符,而在派生类中用new关键字进行重写 ,我想问,它们同样是方法的重写, c#为什么会有两种方法重写方法,这样设计不是重复了呢, 这怎么理解呢? 不重复,首先如果基类里面的virtual方法被子类继承之后,用override重写之后,那么子类里面就只有一个该方法名的方法了.而另一个普通的,就是在子类里面直接通过new 来新建一个方法那叫重载(多态分为重写和重载)

OO 抽象方法与虚方法的区别

 抽象方法与虚方法的区别 抽象方法与虚方法的区别: 一.抽象方法: 1.只能在抽象类中定义: 2.不能有方法的实现:(方法体)[因为抽象类无法实例化,所以抽象方法没有办法被调用,也就是说抽象方法永远不可能被实现.] 3.被子类继承后,必须重写: 4.使用关键字abstract修饰: 二.虚方法: 1.可以在抽象类和普通类中定义: 2.可以有方法的实现(方法体,即使空的也要声明) 3.被子类继承后,可以重写也也可以不重写: 4.使用关键字virtrual修饰:

面向对象:继承、抽象类、抽象方法、虚方法

1.继承什么是继承?目的:代码重用public class 子类:父类{ }父类 基类 被继承的类子类 派生类 需要继承的类 父类构造函数的继承创建子类对象时,先调用父类构造函数,再调用子类构造函数默认调用父类无参构造函数如果子类有无参构造函数,要求父类也有无参构造函数如果调用父类的有参构造函数,显式用base调用 public 子类(参数列表)base(实参)实参:要调用的父类的有参构造函数的参数列表{} base:父类对象(父类实例) 2.抽象abstract 抽象方法:访问修饰符 abst

虚拟方法virtual的用法

unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls; type  TForm1 = class(TForm)    Button1: TButton;    Button2: TButton;    Button3: TButton;    procedure Button1Click(Sender: TO

浅谈接口、抽象类、抽象方法和虚方法的区别

C#抽象类和接口孩子间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于抽象类和接口的选择显得比较随意.其实,两者之间还是有很大区别的. 首先说一下接口与抽象类的异同: 相同点: 1.他们都不能实例化自己,也就是说都是用来被继承的. 2.抽象类中的抽象方法和接口方法一样,都不能有方法体 不同点: 1.抽象类里可以有字段,接口中不能有字段. 2.抽象类中的普通方法可以有方法体,而接口方法没有方法体. 3.接口中的方法不能有访问修饰符,抽象类中的抽象方

抽象方法和虚方法 与设计模式

一.概念 抽象方法和虚方法是什么?先写一段代码看看他们俩的区别. 抽象方法使用abstract关键字:虚方法使用virtaul关键字. <span style="font-size:18px;">//抽象方法 Public abstract class TestPaper { Public abstract Answer(): } </span> <span style="font-size:18px;">//虚方法 Public

C#中抽象方法与虚方法的区别

一.抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. 抽象方法如下示: public abstract class People   //声明一个抽象类 { public abstract void study();  //抽象方法只能定义在抽象类中. } public class Student:People   //继承抽象类 { public  override void study()     //重写抽象类的抽象方法 { Console.Wr

C# 抽象方法和虚方法的区别

一.抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. (1)象方法只能声明在抽象类中,使用关键字abstract (2)抽象类中的抽象方法必须被子类重写. [抽象方法没有方法体,子类必须重写方法体!!,因此抽象方法可以看成是一个没有方法体的虚方法] 二.虚方法:使用virtual修饰的方法: 虚方法可以有方法体. 注意事项:virtual修饰符不能与private.static.abstract.override修饰符同时使用. ps:override