2009-07-20 97 views
29

Tôi đang cố gắng ghi đè phương thức ghi đè (nếu có ý nghĩa!) Trong C#.Ghi đè phương thức ghi đè (C#)

Tôi có một kịch bản tương tự như dưới đây, nhưng khi tôi có điểm ngắt trong SampleMethod() trong lớp "C", nó không bị nhấn, trong khi điểm ngắt tương tự trong phương thức "B" đang được nhấn.

public class A 
{ 
     protected virtual void SampleMethod() {} 
} 

public class B : A 
{ 
     protected override void SampleMethod() 
     { 
      base.SampleMethod(); 
     } 
} 

public class C : B 
{ 
     protected override void SampleMethod() 
     { 
      base.SampleMethod(); 
     } 
} 

Cảm ơn bạn trước!


Edit:

Ok, bối cảnh sẽ giúp:

này nằm trong bối cảnh của một điều khiển tổng hợp để loại A được thừa hưởng từ CompositeControl và gọi SampleMethod() sau khi trọng các CreateChildControls() phương pháp.

+1

mã gọi là gì? –

+0

Hiển thị mã gọi điện cho chúng tôi? –

+0

Đi vào tình huống tương tự, sau khi kiểm tra 'mã gọi', vấn đề được giải quyết. – zionpi

Trả lời

15

Nếu không nhìn thấy mã gọi SampleMethod, tôi đoán là bạn có đối tượng thuộc loại B và gọi SampleMethod trên đó.

+0

Vâng, đây chỉ là một sai lầm ngu ngốc thay mặt tôi - cảm ơn bạn (và tất cả những người đã đóng góp) đã dành thời gian cho việc này. –

29

Ghi đè có thể được thực hiện trong chuỗi miễn là bạn muốn. Mã bạn đã hiển thị là chính xác.

Giải thích duy nhất có thể cho hành vi bạn đang thấy là đối tượng mà bạn đang giới thiệu thực sự thuộc loại B. Tôi khuyên bạn nên kiểm tra kỹ điều này và nếu mọi thứ vẫn không có ý nghĩa, hãy đăng mã ứng dụng khác.

1

Giải pháp đó hoạt động tốt; mặc dù thực sự sử dụng nó bên ngoài lớp học phương pháp này là, bạn cần phải thiết lập các quyền truy cập của SampleMethod-public hơn protected trong tất cả các trường hợp, nó xuất hiện, như vậy:

public class A 
{ 
    public virtual void SampleMethod() 
    { 
     Console.WriteLine("lol"); 
    } 
} 

public class B : A 
{ 
    public override void SampleMethod() 
    { 
     base.SampleMethod(); 
    } 
} 

public class C : B 
{ 
    public override void SampleMethod() 
    { 
     base.SampleMethod(); 
    } 
} 
+0

Nó phụ thuộc vào nơi SampleMethod đang được truy cập từ. Các phương thức Ghi đè/ảo không cần phải công khai. –

3

Các breakpoint là nhiều hơn khả năng không bị đánh bởi vì bạn thực sự đã tạo ra một thể hiện của lớp "B".

Độ phân giải ghi đè phương pháp hoạt động dựa trên loại thời gian thực tế thực tế của lớp học có phương pháp nên được gọi. Vì vậy, nếu bạn đã có đoạn mã sau:

C c = new C(); 
c.SampleMethod(); 

và sau đây:

C c = new C(); 
B b = (B)c; 
b.SampleMethod(); 

cả runtime loại của lớp mà SampleMethod sẽ được gọi là gõ B.

-1

Ghi đè phương pháp là tính năng OOP cho phép lớp con cung cấp triển khai cụ thể phương thức đã được một trong các lớp cha mẹ cung cấp.

+1

Tôi đoán rõ ràng phương pháp ghi đè là gì. –

0

cho Trọng nhiều hơn một lần trong việc sử dụng một cái gì đó hệ thống phân cấp như thế này

// abstract class 
abstract class A 
    { 
     public abstract void MethodOne(); 
    } 

// class B inherits A 
class B : A 
{ 
    public override void MethodOne() 
    { 
     Console.WriteLine("From Class B"); 
    } 
} 

// class C inherits B 
class C : B 
{ 
    public override void MethodOne() 
    { 
     Console.WriteLine("From Class C"); 
    } 
} 

// class D inherits C 
class D : C 
{ 
    public override void MethodOne() 
    { 
     Console.WriteLine("From Class D"); 
    } 
} 

// etc...... 

// class Main method Class 

class MainClass 
{ 
    public static void Main() 
    { 
     B[] TestArray = new B[3]; 
     B b1 = new B(); 
     C c1 = new C(); 
     D d1 = new D(); 

     TestArray[0] = b1; 
     TestArray[1] = c1; 
     TestArray[2] = d1; 

     for (int i = 0; i < TestArray.Length; i++) 
     { 
      TestArray[i].MethodOne(); 
     } 

     Console.ReadLine(); 
    } 
} 

tôi đã làm nó trong mã này trong liên kết này http://www.4shared.com/rar/0SG0Rklxce/OverridingMoeThanOnce.html

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