虚拟和覆盖如何使用那些?

时间:2014-09-19 13:00:10

标签: c# class override virtual

你好我写了两个简单的类

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Kus
{
    class Program : Class1
    {
        public Program()
        {}
        public override void findtheflyingdistance(out int x)
        {   x=0;
            Random r = new Random();
            for (int i = 0; i < 100; i++)
            {
                int z = r.Next(100, 500);
                x += x + z;
            }
            Console.WriteLine("Kuş" + x);

        }
        static void Main(string[] args)
        {
            int x;
            Program pg = new Program();
            pg.findtheflyingdistance(out x);
            Class1 C1 = pg;
            C1.findtheflyingdistance(out x);
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Kus
{
    class Class1
    {
        public Class1(){}
        public virtual void findtheflyingdistance(out int x)
        {   x=0;
            int z=200;
            x += x + z;
            Console.WriteLine("Leylek" +x);

        }
    }
}

因为我理解覆盖方法覆盖虚方法。当我在主程序类中创建两个实例时。在程序类中找到flyingdistance(out int x)工作了两个实例,但是当我做了方法时,在两个clasess中找到了finingdistance(out int x)virtual。每个实例都使用自己的类。所以我不明白场景背后的逻辑。我们为什么要写虚拟方法?如果我们想覆盖一个方法,我们可以覆盖已经覆盖的非虚方法。

1 个答案:

答案 0 :(得分:1)

虚拟允许您覆盖基类中定义的方法。换句话说,它扩展了派生类中方法的实现。

this将是一本有趣的读物。

this stackoverflow回答也给出了一个简短的例子,我在下面为了便利而复制了这个例子:

  

virtual关键字用于修改方法,属性,索引器或   事件声明,并允许在派生类中重写它。   例如,任何继承的类都可以覆盖此方法   它:使用new修饰符显式隐藏从a继承的成员   基类。要隐藏继承的成员,请在派生中声明它   使用相同名称的类,并使用new修饰符修改它。

     

这与多态性有关。调用虚方法时   在引用上,引用的对象的实际类型   是指用于决定使用哪种方法实现。当一个   在派生类(版本)中重写基类的方法   在派生类中使用,即使调用代码没有“知道”   该对象是派​​生类的实例。例如:

public class Base { public virtual void SomeMethod() { } }

public class Derived : Base { public override void SomeMethod() { } }
  ...

 Base b = new Derived(); 
b.SomeMethod(); 
  

最终会打电话   Derived.SomeMethod如果覆盖Base.SomeMethod。

     

现在,如果你使用new关键字而不是override,那么方法就在了   派生类不会覆盖基类中的方法,它只是   隐藏它。在这种情况下,代码如下:

 public class Base { public virtual void SomeOtherMethod() { } }

 public class Derived : Base { public new void SomeOtherMethod() { } }

 ...


 Base b = new Derived();
 Derived d = new Derived();
 b.SomeOtherMethod(); 
d.SomeOtherMethod();
  

首先打电话   Base.SomeOtherMethod,然后是Derived.SomeOtherMethod。他们是   实际上有两个完全独立的方法碰巧有了   相同的名称,而不是覆盖基本方法的派生方法。

     

如果未指定new或覆盖,则结果输出为   就像你指定new一样,但你也会得到一个编译器   警告(因为你可能没有意识到你正在隐藏一个方法   基类方法,或者你可能想要覆盖它,并且   只是忘了包含关键字)。

     

覆盖属性声明可能包含sealed修饰符。   使用此修饰符可防止派生类进一步覆盖   财产。密封财产的存取也是密封的。