铸造派生类作为基类

时间:2016-08-31 12:37:05

标签: c# inheritance casting

假设我有这个:

using System;

public class Program
{
    public static void Main()
    {
        BaseClass bc = new DerivedClass();
        bc.Method1();
        bc.Method2();
        Console.WriteLine(bc.GetType().FullName);

        // Output
        // Derived - Method1 (override)
       // Base - Method2
       // DerivedClass
    }
}

public class BaseClass
{
    public virtual void Method1()
    {
        Console.WriteLine("Base - Method1");
    }

    public virtual void Method2()
    {
        Console.WriteLine("Base - Method2");
    }
}

public class DerivedClass : BaseClass
{
    public override void Method1()
    {
        Console.WriteLine("Derived - Method1 (override)");
    }

    public new void Method2()
    {
        Console.WriteLine("Derived - Method2 (new)");
    }
}

如果派生类的实例变量 cast 到基类,并且该实例变量用于调用重写方法,则使用覆盖关键字覆盖该方法将在派生类中执行实现,而使用new关键字覆盖的实现将在基类中执行实现。

上面示例中的变量bc如何转换为基类?

我知道 new 关键字将覆盖派生类中的方法实现,并且当派生类的实例变量用于调用重写方法时它将被执行,但我不会# 39;不知道它是什么类型的转换..似乎不是隐式也不是显式,可能是类型转换但我对语法感到困惑。

感谢任何解释。

4 个答案:

答案 0 :(得分:3)

  

我知道new关键字将覆盖派生类

中的方法实现

没有。它覆盖基类的方法。它声明了一个 new ,独立的方法,它只是命名相同并具有相同的签名。其效果是 hide 在基类中声明的同一签名方法,有效地复制了在基类中声明的同一签名方法的调用。

在您的示例中,没有'类型转换'任何。将类型转换视为提供实例的特定视图 - 将类的合同的特定部分暴露给用户。仅此而已,仅此而已。

示例:

// instance of DerivedClass exposing its full contract via the 'dc' variable
DerivedClass dc = new DerivedClass();

// the same instance of DerivedClass exposing its contract limited to what's declared in BaseClass
BaseClass bc = dc;

// calling Method2 as newly declared in DerivedClass
dc.Method2();

// calling Method2 as declared in BaseClass—the following two lines are equivalent
bc.Method2();
((BaseClass)dc).Method2();

答案 1 :(得分:1)

实际上,没有转换。只有你看待对象的方式。

  • 如果你用基类眼镜看一下,你会看到所有的基类方法,包括派生类中重写的Method1,但它不会包含派生类中的新Method2,所以你只会从基类中看到Method2。
  • 如果你使用派生类眼镜来看它,你会看到所有基类方法,其中包括来自派生类的重写方法1,但它现在包括新的派生类的Method2。来自基类的原始虚拟Method1将不可见。

答案 2 :(得分:0)

  

上例中的变量bc如何转换为基类?

当您将新的DerivedClass实例分配给BaseClass类型的变量时,会执行隐式转换:

BaseClass bc = new DerivedClass();

答案 3 :(得分:0)

啊,我刚刚找到this,我说它似乎不是隐含的转换我错了......我必须过度阅读此内容。

  

对于引用类型,从类到其任何一个直接或间接基类或接口始终存在隐式转换。不需要特殊语法,因为派生类总是包含基类的所有成员。

Derived d = new Derived();
Base b = d; // Always OK.