2012-06-01 12 views
9
class A 
{ 
    public virtual void WhoAreYou() { Console.WriteLine("I am an A"); } 
} 
class B : A 
{ 
    public override void WhoAreYou() { Console.WriteLine("I am a B"); } 
} 
class C : B 
{ 
public new virtual void WhoAreYou() { Console.WriteLine("I am a C"); } 
} 
class D : C 
{ 
    public override void WhoAreYou() { Console.WriteLine("I am a D"); } 
} 


C c = new D(); 
c.WhoAreYou();// "I am a D" 
A a = new D(); 
a.WhoAreYou();// "I am a B" !!!! 

Referans dahili olarak nasıl dağıtılır, A referansı B? Herhangi biri neler olduğunu açıklayabilir mi?Dinamik Bağlanma C#

+0

Um de kırar ama bu ne oluyor olduğunu düşünüyorum. D sınıfının bir nesnesini bildirdiğinizde ve onu C --- sınıfı C sınıfına atadığınızda, sanal bir işlevi vardır ve bu durumda yalnızca D'nin üzerine yazma işlevini kullanır. Ancak, D sınıfı bir nesneyi beyan ettiğinizde ve onu bir A sınıfına atadığınızda, D, B ve B'den C ve C'den miras aldığından ve sonunda A'dan miras aldığından, aynı zamanda A'nın üzerine yazdığında, o zaman bu baskı ifadesine sahip olursunuz. –

+0

peki: msdn’yi okumak ve sanal/geçersiz kılma/yeni makineyi anlamaya çalışmak? senin örnek tamamen açık! –

+0

@Flo: İlk durumda C nesnesi D'nin D referansını çağırır. Fakat İkinci durumda, A yöntemi, D'nin referansına sahipken, yöntem B yöntemini nasıl çağırdığını (içte ne olduğunu) çağırıyordu. Sessizce Kafa karıştırıcı .. –

cevap

7

, yok WhoAreYou() yöntem Bu temel sınıf yöntemi gizler aynı adıyla bir yeni yöntemi ekler new kelime ile tanımlandığı gibi, temel sınıf yöntemini geçersiz kılar.

C c = new D(); 
c.WhoAreYou();// "I am a D" 

new anahtar sözcüğüyle tanımlanan temel sınıfının yöntemini geçersiz kılar D yılında geçersiz kılınan yöntem çağırır: Bu nedeni budur. Ancak

, hedef tipi, A olduğunu o zaman bu: Eğer yöntem B ile değiştirileceğini tip A ait a üzerine yöntemini aradığınız olarak

A a = new D(); 
a.WhoAreYou();// "I am a B" !!!! 

, B içinde geçersiz kılınan yöntemi çağırır. C'ler

public new virtual void WhoAreYou(){} 

sanal yöntemlerin zincirini kırar o

+0

Nawaz cevabı için teşekkürler. A, D'nin referansının çocuk sınıfları hakkında bilgisi yoktur. Yani, türetilmiş olandan takip etmeliyim. Öyle mi? Eğer demek değilse .. Ama D çağrı B yönteminin referans nasıl ve nasıl iç malzeme gibi A (yöntem tabloları yönünde) türetilmiş sınıfları izlerse daha iyi olacaktır. –

3

Sınıfınız C WhoAreYou() yöntemi "yeni" dir ve bu da B'yi gizlemek içindir. Bu, D sınıfındaki geçersiz kılmanın B'nin yerine B'nin (A'yı geçersiz kılan) yöntemini geçersiz kıldığı anlamına gelir. Bir A bir başvuru yana

, o hiyerarşi kısma var WhoAreYou() işlevi B'de biridir sınıf C olarak

http://msdn.microsoft.com/en-us/library/435f1dw2.aspx

1

O ortalamasıdır. Eğer A'nın referans olarak İD yöntemi WhoAreYou() diyoruz

sanallık işi başlar, ama ben yanlış olabilir C