提问者:小点点

将派生类转换为基类


假设我有这个:

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)");
    }
}

如果派生类的实例变量强制转换为基类,并且该实例变量用于调用重写的方法,则用override关键字重写的方法将执行派生类中的实现,而用new关键字重写的方法将执行基类中的实现。

上面示例中的变量是如何强制转换到基类的?

我知道new关键字将重写派生类中的方法实现,并且当使用派生类的一个实例变量调用重写的方法时它将被执行,但我不知道它是什么类型的转换?。似乎不是隐式的也不是显式的,可能是类型转换,但我被语法弄糊涂了。

如有任何解释,不胜感激。


共3个答案

匿名用户

我知道new关键字将覆盖派生类中的方法实现

不。它不重写基类的方法。它声明了一个新的,独立的方法,命名相同,签名相同。其效果是隐藏了基类中声明的same-signature方法,有效地使基类中声明的same-signature方法的调用复杂化。

在您的示例中,没有任何“类型转换”。将类型强制转换视为提供实例的特定视图,向用户公开类契约的特定部分。不多也不少。

示例:

// 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();

匿名用户

实际地说,没有转换。只有你看物体的方式。

  • 如果您使用base-class-glasses查看它,您将看到所有base-class-methods,其中包括来自派生类的重写的Method1,但它将不包括来自派生类的新的Method2,因此您将只看到来自基类的Method2./li>

匿名用户

上面示例中的变量bc是如何强制转换到基类的?

它是将新的实例分配给类型的变量时执行的隐式强制转换:

BaseClass bc = new DerivedClass();