首页 文章

铸造派生类作为基类

提问于
浏览
1

假设我有这个:

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关键字覆盖的方法将执行在基类中执行实现 .

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

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

任何解释都表示赞赏 .

4 回答

  • 3

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

    不,它 does not 覆盖了基类的方法 . 它声明了一个新的,独立的方法,它只是命名相同并具有相同的签名 . 其结果是隐藏了基类中声明的相同签名方法,有效地复制了在基类中声明的相同签名方法的调用 .

    在你的例子中,没有任何'type conversions' . 将类型转换视为提供实例的特定视图 - 仅仅暴露类的特定部分's contract to the user. It' s,仅此而已 .

    例:

    // 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,但是它不会包含派生类中的新方法2,所以你只会请参阅基类中的Method2 .

    • 如果你使用derived-class-glasses来看它,你会看到所有的基类方法,其中包括来自派生类的重写的Method1,但它现在将 also 包含派生类中的新Method2 . 基类中的原始虚拟Method1将不可见 .

  • 0

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

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

    BaseClass bc = new DerivedClass();
    
  • 0

    啊,我刚刚找到了this,而我说它没有过度阅读这个问题我错了 .

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

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

相关问题