2012-06-01 31 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" !!!! 

Cách tham chiếu được phân bổ nội bộ, tham chiếu A chứa tham chiếu của B? Có ai có thể giải thích Whats đang diễn ra không?Binding động trong C#

+0

Um Tôi có thể sai nhưng tôi nghĩ rằng đây là những gì đang xảy ra. Khi bạn khai báo một đối tượng của lớp D và gán nó cho một lớp C --- lớp C có một hàm ảo và trong trường hợp đó nó sẽ chỉ sử dụng hàm ghi đè của D. Nhưng khi bạn khai báo một đối tượng của lớp D và gán nó cho lớp A điều gì xảy ra là vì D kế thừa từ C và C từ B và B cuối cùng kế thừa từ A nhưng đồng thời ghi đè A thì bạn có lệnh in đó. –

+0

làm thế nào về: đọc msdn và cố gắng hiểu ảo/ghi đè/mới máy? ví dụ của bạn là hoàn toàn rõ ràng! –

+0

@Flo: Trong trường hợp đầu tiên đối tượng C có tham chiếu D nó gọi phương thức D. Nhưng trong trường hợp thứ hai rõ ràng A có tham chiếu của D, trong khi phương thức gọi nó như thế nào gọi phương thức của B (những gì xảy ra trong nội bộ) .. Quiet Confusing .. –

Trả lời

7

Trong lớp C, phương pháp WhoAreYou() không làm ghi đè phương thức lớp cơ sở, vì nó được xác định bằng new từ khóa bổ sung phương thức mới với cùng một tênẩn phương pháp lớp cơ sở. Đó là lý do tại sao điều này:

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

gọi phương thức ghi đè trong D đó sẽ ghi đè phương thức của lớp cơ sở của nó được xác định với new từ khóa.

Tuy nhiên, khi các loại mục tiêu là A, thì đây:

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

gọi phương thức ghi đè trong B, như bạn đang gọi phương thức trên a loại A có phương pháp được overriden bởi B.

+0

Cảm ơn bạn đã trả lời Nawaz. A có tham chiếu về D, A không biết về các lớp con của nó. Vì vậy, tôi phải theo dõi từ một nguồn gốc. Có phải vậy không? Nếu không có nghĩa là .. Nhưng sẽ tốt hơn nếu cách tham chiếu của D gọi phương thức B và cách nó theo dõi các lớp dẫn xuất từ ​​A (trong khía cạnh của các bảng phương thức) như nội dung .. –

3

Phương thức C WhoAreYou() của bạn là 'mới', và để ẩn từ B. Điều đó có nghĩa là ghi đè trong lớp D là ghi đè phương thức của C thay vì B (ghi đè A).

Vì bạn có một tham chiếu đến một A, xa nhất xuống thứ bậc của nó WhoAreYou() chức năng là một trong lớp B.

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

1

Đó là ý nghĩa, rằng C

public new virtual void WhoAreYou(){} 

phá vỡ chuỗi các phương pháp ảo.

Khi bạn gọi phương thức WhoAreYou() của D bằng cách tham chiếu của A. Các tính ảo bắt đầu làm việc, nhưng nó phá vỡ tại C.

Các vấn đề liên quan