2012-12-21 23 views
6

Wikipedia phân loại "siêu cuộc gọi" thành dạng chống mẫu và tôi thực sự không hiểu tại sao. Các mô hình được sử dụng khá thường xuyên trong mục tiêu C/ca cao; ví dụ init/dealloc, drawrect, awakefromnib tất cả đều yêu cầu bạn gọi super. Tôi có hiểu nhầm khái niệm ở đây không?Tại sao "siêu gọi" được coi là một mẫu chống theo Wikipedia?

Liên kết đến bài viết: http://en.wikipedia.org/wiki/Call_super

+0

Bạn có thể cung cấp nguồn không? gọi siêu là chỉ là một phần của lập trình hướng đối tượng, tôi không biết tại sao điều này nên là một mô hình chống .. – NSAddict

+0

Liên kết đến bài viết wikipedia có liên quan? (Hãy nhớ rằng Wikipedia được cộng tác chỉnh sửa, chúng _could_ là sai). – driis

+0

Điều này thực sự buồn là câu hỏi này được đánh dấu là "không mang tính xây dựng". Tôi thấy nó rất quan trọng – Kuba

Trả lời

13

Vì nó nói trong the article, nó là cần thiết để gọi phương thức siêu đó là antipattern, tức là lớp siêu "dự đoán" bạn ghi đè phương pháp để làm cho chức năng hoàn chỉnh - nhưng nó làm như vậy mà không làm cho kỳ vọng này rõ ràng. Và nó cũng hy vọng bạn gọi thực hiện siêu. Cả hai đều được yêu cầu để chương trình hoạt động.

Đây là một mẫu đơn, vì mục đích của lập trình viên không thể được suy ra từ mã. Nếu đồng nghiệp của bạn quyết định làm việc trên nó, họ sẽ không biết những gì bạn mong đợi lớp học để làm, và do đó có khả năng gặp phải vấn đề và/hoặc kích thích.

Vì vậy, nếu bạn mong đợi một số phần của phương pháp bị ghi đè, nhưng những thứ khác cần phải giữ nguyên, bạn nên sử dụng template method pattern, nơi bạn giữ tất cả những thứ không được thay thế trong một (riêng tư) , sau đó gọi một số khác - hoàn toàn riêng biệt -, phải được triển khai để chương trình hoạt động (bằng một số ngôn ngữ, thậm chí nó sẽ không biên dịch). Bằng cách đó, bạn chắc chắn rằng những điều quan trọng vẫn là nơi họ phải làm, và bất cứ ai mở rộng lớp học sẽ biết chính xác phải làm gì, trong khi vẫn còn không biết gì về các chi tiết triển khai khác.

Mục tiêu-C không có phương pháp trừu tượng hoặc ảo, nhưng bạn có thể đạt được hiệu quả tương tự bằng cách tăng rõ ràng ngoại lệ nếu phương thức siêu được gọi. Bằng cách đó, nếu đồng nghiệp của bạn quên ghi đè phương thức, chương trình sẽ gặp sự cố - và chương trình sẽ gặp sự cố với thông báo lỗi mà họ sẽ hiểu và điều đó sẽ giúp họ hiểu và khắc phục sự cố nhanh hơn và dễ dàng hơn hành vi không có giải thích, do chức năng không được hoàn thành.

+0

Sửa lỗi nếu tôi sai, nhưng có các mẫu trong Objective-C không? –

+0

nhưng đó không phải là những gì OP đang yêu cầu. –

+0

Anh ấy hỏi lý do tại sao cuộc gọi siêu là một mô hình chống, chính xác. Tôi trả lời, phải không? – weltraumpirat

3

Các ý chính của vấn đề là:

..However, thực tế là ngôn ngữ chính nó có thể không có khả năng thực thi tất cả các điều kiện quy định theo yêu cầu đây là những gì làm cho điều này một mô hình chống .

Vì vậy, các tác giả rất hậu thuẫn về việc các lập trình viên phải làm điều gì đó mà họ tin rằng ngôn ngữ nên làm cho họ.

Các giải pháp được đề cập trong bài viết wikepedia Call Super là:

Một cách tiếp cận tốt hơn để giải quyết những vấn đề này là thay vào đó sử dụng phương pháp mô hình mẫu , nơi cha bao gồm một phương pháp hoàn toàn trừu tượng đó phải được thực hiện bởi các lớp con và có phương thức gốc gọi phương thức

Vấn đề là Objective-c không có chức năng ảo. Nó chỉ có tin nhắn, vì vậy bạn không thể thực hiện những gì wikepedia gợi ý.

+0

Vậy tại sao mẫu template được xem là tốt hơn gọi siêu chính xác? – eyebrowsoffire

+0

@eyebrowsoffire xem chỉnh sửa của tôi –

+1

@While Peter là chính xác khi nói rằng không có chức năng ảo nào cũng dễ tạo ra ngữ nghĩa tương tự (ví dụ: xem câu trả lời http://stackoverflow.com/questions/13793864/abstract-class-for-objective- c) 13797335 # 13797335). Vì vậy, nếu bạn muốn, bạn có thể triển khai mẫu khuôn mẫu. – CRD

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