你好我写了两个简单的类
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。每个实例都使用自己的类。所以我不明白场景背后的逻辑。我们为什么要写虚拟方法?如果我们想覆盖一个方法,我们可以覆盖已经覆盖的非虚方法。
答案 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修饰符。 使用此修饰符可防止派生类进一步覆盖 财产。密封财产的存取也是密封的。