I have the following code.
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();
}
}
If I run this code, I get the result "Child Method" But if I do the following, why do I get the result "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();
}
}
The only difference is as below
Child C = new Child();
Parent P = new Child();
I thought new Child()
means that we create the instance of Child
class.
And I thought both, C
and P
, are just object reference variables that hold the location of instance of Child
class.
Can you correct me if I'm wrong or tell me if I miss something because I don't understand why in the above cases I get different results?
It's because you've redeclared the Print
method in Child
. So at compile time, P.Print()
resolves to Parent.Print
, but C.Print()
resolves to Child.Print()
. If you had a virtual method which was overridden in Child
instead, they'd both print "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");
}
}
Related:
override
and new
? (C# FAQ entry on MSDN - turns out to have been written by me, but I'd forgotten!)override
and new
keywords (MSDN)See more on this question at Stackoverflow