zoukankan      html  css  js  c++  java
  • C#中的virtual、override

    转载:http://ks.cn.yahoo.com/question/1307051303401.html

    C# 是面向对象的程序设计语言,每一个函数都属于一个类。

    当一个方法被声明为Static时,这个方法是一个静态方法,编译器会在编译时保留这个方法的实现。也就是说,这个方法属于类,但是不属于任何成员,不管这个类的实例是否存在,它们都会存在。就像入口函数Static void Main,因为它是静态函数,所以可以直接被调用。

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

    例如,有一个类Test,Test类拥有两个方法Hello()和greet():
    public class test
    {
    public void Hello()
    {
    System.Console.WriteLine("hello, world!");
    }
    .....
    }
    类TestMe派生自类Test,那么当你使用如下的代码:
    Test a = new TestMe();
    创建一个TestMe类的新实例后,假如你试图执行如下的代码:
    a.Hello();
    那么,自然就会运行基类Test的Hello()方法,但是如果你想给予派生类TestMe一个它自己的Hello()方法,你就要在Test类中将Hello()方法声明为虚拟的:
    public virtual void Hello()
    {
    ...
    }
    然后在派生类中以override关键字表示覆盖基类的方法:
    public class TestMe : Test
    {
    ...

    public overrice void Hello()
    {
    System.Console.WriteLine("hello from TestMe class!!!");
    }

    ....
    }
    这时调用a.Hello(),就会出现“hello from TestMe class!!!”字样,而不是“Hello,world!”说明基类的方法已经被覆盖了。这就是多态性的表现。

    从上面不难看出,一个静态的方法是真实存在的,而一个虚拟方法可以被派生类重写,这二者是冲突的,其实对于一个方法,C#规定只能使用下面这些限定符中的一个:
    override virtual static abstract sealed
    代表的含义分别为:
    重载函数、虚拟函数、静态函数、抽象函数、密封函数(不可派生)

    另外,C#中定义一个方法的声明为:

    可见性 类型 返回值 方法名(参数列表){方法体}

    例如
    public static void Test(int a){System.Console.WriteLine(a.ToString());}

    这是一个公有的静态函数,函数名为Test,无返回值,有一个整形参数a,作用是把a的值输出在屏幕上。

  • 相关阅读:
    oracle当需要commit
    Win7 扩容磁盘分区
    MP3的频率、比特率、码率与音质的关系
    关于cocos2dx 3.0升级崩溃报错(unable to load native library) 和(Fatal signal 11 (SIGSEGV) at 0x00000000)
    开机黑屏 仅仅显示鼠标 电脑黑屏 仅仅有鼠标 移动 [已成功解决]
    Java串口通信具体解释
    android 计时器,倒计时
    联想A208T ROOT
    三层架构(我的理解及具体分析)
    Java实现BASE64编解码
  • 原文地址:https://www.cnblogs.com/msnadair/p/1340153.html
Copyright © 2011-2022 走看看