相关疑难解决方法(0)

关于虚拟/新/覆盖的困惑

我对virtual/ new/ override事情有点困惑.这是一个例子:

class A
{
    public virtual void mVVirtual() { Console.WriteLine("A::mVVirtual"); }
}

class B : A
{
    public virtual void mVVirtual() { Console.WriteLine("B::mVVirtual"); }
}

class C : B
{
    public override void mVVirtual() { Console.WriteLine("C::mVVirtual"); }
}


class Test
{
    static void Main()
    {
        B b1 = new C();
        b1.mVVirtual();    //C::mVVirtual ... I understand this

        A a2 = new C();
        a2.mVVirtual();    //A::mVVirtual ... ???
    }
}
Run Code Online (Sandbox Code Playgroud)

我不明白为什么在第二次通话中我们得到了A::mVVirtual.我通常用这个"算法"处理这些问题:

  1. 对于一个名为的实例方法,检查保存对象引用的变量的类型mVVirtual?没有一个......但确实有一个带有该签名和名称的虚拟方法!
  2. 虚方法?然后让我们检查 …

c# virtual overriding keyword new-operator

8
推荐指数
3
解决办法
1695
查看次数

有关Virtual/new ... plus接口的更多信息!

昨天我发布了一个关于new/virtual/override关键字的问题,我从你的答案中学到了很多东西.但我仍有一些疑虑.

在所有"盒子"之间,我与类型的方法表中真正发生的事情失去联系.例如:

interface I1 { void Draw(); }
interface I2 { void Draw(); }

class A : I1, I2
{
    public void Minstance() { Console.WriteLine("A::MInstance"); }
    public virtual void Draw() { Console.WriteLine("A::Draw"); }
    void I2.Draw() { Console.WriteLine("A::I2.Draw"); }
}
class B : A, I1, I2
{
    public new virtual void Draw() { Console.WriteLine("B::Draw"); }
    void I1.Draw() { Console.WriteLine("B::I1.Draw"); }
}

class Test
{

    public static void Main()
    {
        A a = new B();
        a.Draw();
        I1 i1 = new A();
        i1.Draw(); …
Run Code Online (Sandbox Code Playgroud)

c# virtual overriding interface new-operator

4
推荐指数
1
解决办法
449
查看次数

标签 统计

c# ×2

new-operator ×2

overriding ×2

virtual ×2

interface ×1

keyword ×1