gpt4 book ai didi

c# - 为什么要将子类对象赋值给父类引用变量?

转载 作者:可可西里 更新时间:2023-11-01 03:14:06 24 4
gpt4 key购买 nike

我有以下代码。

public class Parent
{
public void Print()
{
Console.WriteLine ("Parent Method");
}
}

public class Child : Parent
{
public new void Print()
{
Console.WriteLine ("Child Method");
}
}

public class Program
{
public static void Main()
{
Child C = new Child();
C.Print();
}
}

如果我运行这段代码,我会得到结果“Child Method”但是,如果我执行以下操作,为什么会得到结果“Parent Method”?

public class Parent
{
public void Print()
{
Console.WriteLine ("Parent Method");
}
}

public class Child : Parent
{
public new void Print()
{
Console.WriteLine ("Child Method");
}
}

public class Program
{
public static void Main()
{
Parent P = new Child(); // The only difference is this.
P.Print();
}
}

唯一的区别如下

Child C = new Child();   
Parent P = new Child();

我认为 new Child() 意味着我们创建了 Child 类的实例。我认为 CP 只是保存 Child 类实例位置的对象引用变量。
如果我错了,你能纠正我吗?或者如果我错过了什么,因为我不明白为什么在上述情况下我会得到不同的结果,你能告诉我吗?

最佳答案

这是因为您在Child 中重新声明了Print 方法。所以在编译时,P.Print() 解析为 Parent.Print,而 C.Print() 解析为 Child。打印()。如果你有一个在 Child 中被覆盖的虚拟方法,它们都会打印“Child Method”:

public class Parent
{
// Declare this as virtual, allowing it to be overridden in
// derived classes. The implementation will depend on the
// execution-time type of the object it's called on.
public virtual void Print()
{
Console.WriteLine ("Parent Method");
}
}

public class Child : Parent
{
// Override Parent.Print, so if Print is called on a reference
// with compile-time type of Parent, but at execution it
// refers to a Child, this implementation will be executed.
public override void Print()
{
Console.WriteLine ("Child Method");
}
}

相关:

关于c# - 为什么要将子类对象赋值给父类引用变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31684696/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com