2011-01-18 16 views
24

Khi sử dụng một số khung/api, đôi khi nó không rõ ràng nếu bạn phải gọi base.Method nếu bạn ghi đè lên nó, ví dụ bạn có thể khá chắc chắn rằng bạn nên gọi base.Maethod() khi bạn đang ghi đè invocater sự kiện, để tuyên truyền sự kiện, trong các tình huống khác, nó có thể không rõ ràng, đặc biệt là khi không có mã nguồn có sẵn, và không có ý kiến.Khi nào bạn nên gọi base.Method() trong phương thức ghi đè và cách đánh dấu điều này khi bạn viết mã trong nhóm?

Tôi làm cách nào mà các lập trình viên khác quyết định nên gọi phương thức cơ sở hay không trong tình huống này, và nếu bạn chuẩn bị viết một số khung làm thế nào để thông báo cho các lập trình viên khác mà bạn mong đợi được gọi hay không trong các thành viên ảo.

Trả lời

7

Điều đó tùy thuộc vào chức năng cơ bản cần được sử dụng hay không.

Ví dụ: nếu đối tượng cơ sở có một số chức năng cơ sở dữ liệu chung cần chạy, hãy gọi phương thức cơ sở ở cuối. Nếu mã của bạn ghi đè lên một số thuộc tính mà phương thức cơ sở sẽ đặt, thay vào đó hãy gọi phương thức cơ sở trước.

Nếu không có mã nguồn hoặc tài liệu, RedGate's .Net Reflector (http://www.red-gate.com/products/dotnet-development/reflector/) chỉ có thể giải nén các hội đồng bạn đang cố gắng sử dụng và bạn có thể xem cách mã hoạt động.

+2

[DotPeek] (http://www.jetbrains.com/decompiler/) sẽ là một giải pháp thay thế miễn phí cho Trình phản xạ .NET của RedGate (tốt hơn nữa, tôi có cả và tôi thấy mình chỉ sử dụng DotPeek) . – MasterMastic

9

Nếu bạn đang đòi hỏi rằng người tiêu dùng của lớp học của bạn PHẢI thực hiện chức năng của một phương pháp cụ thể, phương pháp mà nên được đánh dấu trừu tượng.

Nếu người tiêu dùng trong lớp học của bạn tùy chọn cung cấp chức năng của một phương pháp cụ thể, phương pháp đó phải là ảo.

Thực sự không có cách nào để yêu cầu người tiêu dùng của một lớp gọi cơ sở.Method() trên phương thức ảo. Nó thực sự phụ thuộc vào ngữ cảnh. Nếu base.Method() thực hiện một số công việc mà bạn sẽ phải làm, nó sẽ xử lý bạn gọi base.Method() nếu điều đó sẽ giúp bạn tiết kiệm thời gian phát triển/nó có ý nghĩa trong ngữ cảnh đó.

+0

Tôi upvoting này bởi vì trong kinh nghiệm của tôi, tôi hiếm khi sử dụng các lớp trừu tượng trong các dự án của riêng tôi, nhưng điều này đưa ra một ví dụ rất rõ ràng về thời điểm sử dụng chúng. –

18

Ngày nay tôi không nghĩ rằng người tiêu dùng của một lớp mà ghi đè lên một phương pháp bao giờ nên cần phải gọi base.Method(). Mã nên được viết theo cách như vậy mà nó không thể bị phá vỡ.

public class MyBase 
{ 
    private void FooInternal() 
    { 
     DoRequiredStuff(); 
     Foo(); 
    } 
    public virtual void Foo() {} 
} 
Các vấn đề liên quan