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

Posted 剧里局外

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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中的任一修饰符。

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

以上是关于C#抽象方法和虚拟方法理解的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C# 接口方法没有声明为抽象或虚拟的?

C#通过完整的例子,Get常用的2个套路,理解抽象方法,虚方法,接口,事件

浅谈 C# 多态的魅力 - 虚方法抽象接口实现

C#中抽象方法与虚方法的区别详解及示例

C#多态性学习,虚方法抽象方法接口等用法举例

《转》 浅谈C# 多态的魅力(虚方法,抽象,接口实现)