A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ┾——黑马 中级黑马   /  2013-9-26 22:38  /  1952 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ┾——黑马 于 2013-9-27 11:59 编辑

virtual和override用来给子类和父类之间重写方法使用的,具体怎么使用...

5 个回复

倒序浏览
virtual方法:

        如果在父类中使用了virtual关键字,而在其派生类中有没有override或new关键字,而直接引用一个同名方法的话,编译器将会报告错误,并将使用new方法,及以忽略派生类中的方法的方式来运行。

         为了是派生类的实例完全代替来自基类的类成员,基类必须将该成员声明为虚拟的。这是通过在该成员的返回类型之前添加virtual关键字来实现的。

使用virtual需注意:

virtual修饰符不能与static、abstract、private或override修饰符一起使用。
在静态属性上的使用virtual修饰符是错误的。
通过使用override修饰符的属性声明,可在派生类中重写virtual继承属性。
         override方法:

         override方法是提从基类继承的成员的新实现。通过override声明重写的方法称为重写方法。重写方法必须是virtual、abstract或override的。

         如果在派生类中的方法前使用带有override的关键字,则派生类的对象将调用该方法,而不调用基类中的方法。

使用override需注意:

override生命不能更改virtual方法的可访问性。
override方法和virtual方法必须具有相同的访问级别修饰符。
不能使用修饰符new、static、virtual或abstract来修饰override方法。
重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是virtual、abstract或override的。
回复 使用道具 举报
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的值输出在屏幕上。
回复 使用道具 举报
virtual  override  new
简单说override将virtual的内容覆盖了,new不覆盖virtual内容,而是重新开辟了空间
例如:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace virtual与override
{
    class Program
    {
        class A
        {
            public virtual string Name
            {
                get;
                set;
            }
            public virtual void Say()
            {
                Console.WriteLine("A的Say");
            }
        }
        class B:A
        {
            private string name;
            new public  string Name
            {
                get
                { return name; }
                set
                {
                    if (value != string.Empty)
                    {
                        name = value;
                    }
                    else
                    {
                        name = "不知道";
                    }
                }
            }
            public override void Say()
            {
                Console.WriteLine("B的Say");
            }
        }
        static void Main(string[] args)
        {
            B b = new B();
            A a = b;
            b.Name = "张三";
            a.Name = "李四";
            Console.WriteLine(b.Name);//结果为张三,说明a.Name="李四"是另一个属性,new并不覆盖virtual
            Console.WriteLine(a.Name);//结果为李四
            b.Say();//结果为B的Say
            a.Say();//结果为B的Say,override将父类中的virtual方法覆盖重写了

            A ac =new A();
            ac.Name = "111";
            Console.WriteLine(ac.Name);//结果为111
            ac.Say();//结果为A的Say,证明A中的virtual也是可以实现的
            
            Console.ReadKey();
        }
    }
}
回复 使用道具 举报
virtual 关键字用于修改方法或属性的声明,在这种情况下,方法或属性被称作虚拟成员。虚拟成员的实现可由派生类中的重写成员更改。   
调用虚方法时,将为重写成员检查该对象的运行时类型。将调用大部分派生类中的该重写成员,如果没有派生类重写该成员,则它可能是原始成员。
默认情况下,方法是非虚拟的。不能重写非虚方法。
不能将 virtual 修饰符与以下修饰符一起使用:  static   abstract   override   
除了声明和调用语法不同外,虚拟属性的行为与抽象方法一样。  ·
在静态属性上使用 virtual 修饰符是错误的。   ·
通过包括使用 override 修饰符的属性声明,可在派生类中重写虚拟继承属性。

override 方法提供从基类继承的成员的新实现。 由 override 声明重写的方法称为重写基方法。 重写的基方法必须与 override 方法具有相同的签名。
不能重写非虚方法或静态方法。 重写的基方法必须是 virtual、abstract 或 override。
override 声明不能更改 virtual 方法的可访问性。 override 方法和 virtual 方法必须具有相同的访问级别修饰符。
不能使用 new、static 或 virtual 修饰符来修改 override 方法。
重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是 virtual、abstract 或 override 。
回复 使用道具 举报
virtual方法:

        如果在父类中使用了virtual关键字,而在其派生类中有没有override或new关键字,而直接引用一个同名方法的话,编译器将会报告错误,并将使用new方法,及以忽略派生类中的方法的方式来运行。

         为了是派生类的实例完全代替来自基类的类成员,基类必须将该成员声明为虚拟的。这是通过在该成员的返回类型之前添加virtual关键字来实现的。

使用virtual需注意:
•virtual修饰符不能与static、abstract、private或override修饰符一起使用。
•在静态属性上的使用virtual修饰符是错误的。
•通过使用override修饰符的属性声明,可在派生类中重写virtual继承属性。

         override方法:

         override方法是提从基类继承的成员的新实现。通过override声明重写的方法称为重写方法。重写方法必须是virtual、abstract或override的。

         如果在派生类中的方法前使用带有override的关键字,则派生类的对象将调用该方法,而不调用基类中的方法。

使用override需注意:
•override生命不能更改virtual方法的可访问性。
•override方法和virtual方法必须具有相同的访问级别修饰符。
•不能使用修饰符new、static、virtual或abstract来修饰override方法。
•重写属性声明必须指定与继承属性完全相同的访问修饰符、类型和名称,并且被重写的属性必须是virtual、abstract或override的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马