Virtual和 Override用法

今天学习了一些Virtual 的用法

    以前也用过Virtual ,Override等方法 ,但一直也没有想过在什么时候用这些方法,只是一味的copy代码,导致现在对这些概念也一直很模糊。这2天实在是因为看到robin代码中用了太多的 virtual 方法 ,所以才下定决心要弄清楚。
   我做了以下的试验:

    public class Base
    {
        public string AccoutInfo()
        {
          system.console.writeline("Base AccoutnInfo!");
        }
    }

    public class Student:Base
    {
        public string AccoutInfo()
        {
            system.console.writeline("Student AccoutInfo");
        }
    }

    static void Main(string[] args)
    {
            OOStudy.Student student = new OOStudy.Student();
            Console.WriteLine(student.AccoutInfo());
     }

Result:Student AccoutInfo // 输出子类的信息

public class Base
    {
        public vitual string AccoutInfo()
        {
          system.console.writeline("Base AccoutnInfo!");
        }
    }

    public class Student:Base
    {
        public override  string AccoutInfo()
        {
            system.console.writeline("Student AccoutInfo");
        }
    }

    static void Main(string[] args)
    {
            OOStudy.Student student = new OOStudy.Student();
            Console.WriteLine(student.AccoutInfo());
     }

Result:Student AccoutInfo // 输出子类的信息

同时我也把Student 中的 override 去掉了,发现输出的结果还是一样的

这个时候,我就很纳闷了 ,这个结果一直都是子类的,根本没什么影响啊!
只能在网上找资料了,发现讲vitual 的,都是 OOStudy.Base student = new OOStudy.Student(); 初始化一个类

我就这样跟着改了之后,发现结果出现了变化。

public class Base
    {
        public vitual string AccoutInfo()
        {
          system.console.writeline("Base AccoutnInfo!");
        }
    }

    public class Student:Base
    {
        public string AccoutInfo()
        {
            system.console.writeline("Student AccoutInfo");
        }
    }

    static void Main(string[] args)
    {
            OOStudy.Base student = new OOStudy.Student();
            Console.WriteLine(student.AccoutInfo());
     }
Result:Base AccoutnInfo! //输出父类的信息

public class Base
    {
        public string AccoutInfo()
        {
          system.console.writeline("Base AccoutnInfo!");
        }
    }

    public class Student:Base
    {
        public string AccoutInfo()
        {
            system.console.writeline("Student AccoutInfo");
        }
    }

    static void Main(string[] args)
    {
            OOStudy.Base student = new OOStudy.Student();
            Console.WriteLine(student.AccoutInfo());
     }
Result:Base AccoutnInfo! //输出父类的信息

public class Base
    {
        public vitual string AccoutInfo()
        {
          system.console.writeline("Base AccoutnInfo!");
        }
    }

    public class Student:Base
    {
        public override  string AccoutInfo()
        {
            system.console.writeline("Student AccoutInfo");
        }
    }

    static void Main(string[] args)
    {
            OOStudy.Base student = new OOStudy.Student();
            Console.WriteLine(student.AccoutInfo());
     }
Result:Student AccoutInfo  //重写了父类的方法 ,输出子类的信息

看到这些结果后,我知道了子类转化为父类的时候 ,如果父类用了virtual 方法,子类中用了override方法,就输出子类的信息,其他的情况都是输出父类的信息。

这个时候我还一下子没有明白过来是怎么一回事,只能想我以前是在什么情况下用过override方法了。在sharepoint 中开发webpart ,对事件的处理的时候, 都用到override方法,事件的override方法 的类是会继承一个SPItemEventReceiver 的类,想到这些后,我又想到了SPItemEventReceiver类中会对应一个virtual的方法 ,在我写完了这些方法的时候,我会把事件注册到一个对应的sharepoint的listItem中。这个时候我就有点明白了,其实注册的过程就是为了把父类和子类的方法联系起来,实现一个OOStudy.Base student = new OOStudy.Student();的关系,这样我们就能够完成我们的2次开发了。这个用法基本上就是这样的了
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值