2009-10-27 43 views
7

Tôi chưa bao giờ thực sự sẵn sàng với câu hỏi này: Nhưng nó có phải là một tội ác khủng khiếp để gọi base.SomeMethod() có điều kiện trong một phương thức ghi đè không?Gọi một phương thức cơ sở ghi đè có điều kiện trong C#

Ví dụ như trong:

protected override void SomeMethod() 
{ 
    if(condition > 0) 
     base.SuperMethod(); 
} 

Tôi biết rằng điều này có thể được coi là thực hành xấu, nhưng tôi đã thực sự chưa bao giờ đọc một tuyên bố như vậy cho đến nay.

Trả lời

10

Tôi không thể nghĩ ra lý do tại sao điều này sẽ không tốt trên đầu của tôi.

Sẽ tồi tệ hơn rất nhiều khi ghi đè phương thức cơ sở và sao chép chức năng của phương thức cơ sở để gọi có điều kiện thay vì chỉ gọi phương thức cơ sở.

7
class HardHearingPerson : Person 
{ 
    override void Listen() 
    { 
    if (volume.Acceptable()) 
     base.Listen(); 
    } 
} 

Đoán điều đó phụ thuộc vào ngữ cảnh, nhưng tôi chắc chắn nó có thể sử dụng hợp lý.

2

Tôi làm điều này khá thường xuyên. Mỗi lần tôi cần phải "làm điều gì đó khác" trong một phương pháp tôi ghi đè lên nó làm công cụ của tôi và gọi phương thức cơ bản (hoặc ngược lại)

+0

Bạn có thiếu phần 'có điều kiện' không? – leppie

+0

@leppie: Không. "Làm điều gì đó nhiều hơn" có thể bao gồm các điều kiện – Sergio

1

Tôi nghĩ rằng nó hoàn toàn có thể chấp nhận được. Bạn có thể muốn ghi đè hành vi của một phương thức lớp cơ sở chỉ trong một số trường hợp nhất định, hoặc mở rộng hành vi bằng cách gọi phương thức cơ sở sau đó làm việc của riêng bạn.

+0

Điều đó có thể biện minh cho một lớp học khác (chuyên môn) :) – leppie

+0

@leppie - không kế thừa số lớp khi tạo lớp khác? Lấy ví dụ này: lớp CSharpProgrammer kế thừa lớp Programmer ... CSharpProgrammer là một lớp chuyên biệt dựa trên Programmer. –

1

Lớp học nên designed for inheritance:

Nếu lớp cơ sở được thiết kế theo một cách mà gọi phiên bản cơ sở của phương pháp nhất định là không bắt buộc thì đó là ok để bỏ qua những cuộc gọi.

Nếu lớp cơ sở được thiết kế theo cách mà phiên bản cơ sở PHẢI được gọi thì không thể bỏ qua chúng.

Thảo luận cho dù đây là một "thực hành tốt" bỏ lỡ điểm, theo ý kiến ​​của tôi. Cách thức mà một lớp được cấu trúc để thừa kế dựa trên mục đích và thiết kế của nó. Quyết định của liệu bạn THÁNG hoặc PHẢI phiên bản cơ sở tiếng gọi của một phương pháp là một phần của các lớp public interface, quan đến thừa kế.

Bạn không thể quyết định thời điểm mong muốn hoặc không mong muốn gọi phương thức lớp cơ sở khi bạn ghi đè mà không hiểu cách lớp cơ sở được thiết kế và mục đích của từng phương pháp.

+1

Đây là lý do tại sao 'niêm phong' phải là mặc định trong C#; hoặc ít nhất, có thể đặt 'cơ sở' nơi có thể đặt' niêm phong'. –

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