Aşağıdaki kodum var.Çocuk sınıfı nesnesini neden üst sınıf referans değişkenine ataıyoruz?
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();
}
}
Bu kodu çalıştırırsanız, ben "Çocuk Yöntemi" sonuç almak Ama aşağıdakileri yaparsanız, neden sonuç "Veli Yöntemi" alırım? Ben new Child()
biz Child
sınıfın örneğini oluşturmak demektir düşünce
Child C = new Child();
Parent P = new Child();
aşağıda
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();
}
}
tek farktır. Ve ben her ikisi de, C
ve P
, yalnızca Child
sınıfının örneğinin konumunu tutan nesne başvuru değişkenleri olduğunu düşündüm.
Yanlış mıyım, yoksa bir şey mi özlediğimi söyler misin, çünkü yukarıdaki durumlarda neden farklı sonuçlar aldığımı anlamıyorum.
bunları geçersiz kılma değil, yöntemler saklandıkları çünkü. P.Print yazdığınızda, derleyici gizli alt yöntemi değil, yalnızca ebeveyn yazdırma yöntemini çağırabilir. –
Olası kopya: http://stackoverflow.com/questions/17717570/why-does-calling-a-method-in-my-derived-class-call-the-base-class-method –
Bir kenara tavsiye ederim yasal olarak gerekmedikçe yöntem gizleme kaçınmak. Kodun sürdürülmesi zorlaşır. Eric Lippert'in [Metod Gizleme Metodolojisi] 'ni alıntılamak (http://blogs.msdn.com/b/ericlippert/archive/2008/05/21/method-hiding-apologia.aspx), "Türetilmiş türlerin sözleşmeleri kırdığı görülüyor Eğer bir tür D tipi taban sınıfı B üzerinde bir metod M gizlerse, çünkü DM, BM'den farklı bir şey yapar, farklı bir ismi olmamalıdır? " – Brian