2010-02-02 8 views
9

Tôi muốn biết phương pháp mở rộng C# có dựa trên bất kỳ mẫu thiết kế hiện có nào không.C# Phương pháp mở rộng - mẫu thiết kế

+0

Không sử dụng các phương pháp mở rộng, xem mục này Eric Lipperts blog "foreach V's ForEach" http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs-foreach.aspx –

Trả lời

11

Mẫu thiết kế đơn giản là một mô hình nổi tiếng, tức là "khi bạn muốn đạt được X, làm Y". Một mô hình nổi tiếng trong các ngôn ngữ hướng đối tượng như C# là "khi bạn muốn hành động trên trạng thái của một đối tượng, hãy gọi một phương thức trên một thể hiện của nó". Tuy nhiên, trước khi các phương thức mở rộng được tạo ra, bạn không thể gọi phương thức của riêng bạn trên một thể hiện của đối tượng mà bạn không thể thêm thực hiện vào (ví dụ: giao diện vì chúng không thể triển khai, hoặc các lớp thư viện vì chúng đã được biên dịch trước đó).). Các phương thức mở rộng lấp đầy khoảng trống này bằng cách cho phép bạn tạo các phương thức xuất hiện để có thể gọi được trên các thể hiện của đối tượng, trong khi được định nghĩa bên ngoài để thực hiện đối tượng.

Vì vậy, có, các phương pháp mở rộng được cho là dựa trên mẫu thiết kế rất đơn giản này, làm cho các phương thức hoạt động trên trạng thái của một đối tượng có thể gọi được từ một thể hiện của nó.

4

No. Nó chỉ là một tính năng ngôn ngữ.

+0

Nó có thể là cả hai. Ví dụ, đại biểu là một tính năng ngôn ngữ C# cho phép mẫu nhà xuất bản-thuê bao. – Anthony

0

Tất nhiên bạn có thể sử dụng phương pháp mở rộng C# nếu bạn muốn triển khai các mẫu thiết kế nhất định. Ví dụ mô phỏng mixin trong C#.

0

tôi sẽ không nhãn Mở rộng phương pháp như bất kỳ của các mẫu thiết kế thông thường, nhưng nó có thể được sử dụng để thực hiện các mẫu như, Decorator và Adaptor vv ..

1

Họ không dựa trên một mẫu thiết kế có sẵn. Khi 'tính năng' này được giới thiệu lần đầu tiên tại Delphi, dưới tên 'class helpers', Borland thậm chí còn cảnh báo người dùng cách xa họ. They were considered a bit of a hack, nhưng bây giờ bụi đã ổn định họ đã tìm thấy một nơi của riêng mình.

Giống như mọi thứ khác, sử dụng khi thích hợp.

1

Không, chúng không phải vì chúng chỉ là đường cú pháp.

+0

cũng nói đúng phương pháp mở rộng là _not_ đường suntactic. Nhưng khả năng của bạn để gọi chúng với cú pháp giống như các phương thức instance. –

+1

Nếu bạn không tin tôi, bạn có thể chỉ đơn giản là cố gắng tìm trong google cụm từ này: "phương pháp mở rộng là cú pháp đường" và bạn có thể tìm thấy hàng trăm liên kết chứng minh ý kiến ​​của tôi. –

+1

Rune, mà không có phương pháp mở rộng khả năng này chỉ là phương pháp tĩnh thường xuyên. "Khả năng gọi chúng bằng cú pháp giống như các phương thức ví dụ" * là * tính năng duy nhất của các phương thức mở rộng, và như bạn đã nói, tính năng này là cú pháp đường. –

8

Phương pháp mở rộng có thể được coi là thay thế Visitor Pattern. Nó cũng được đề xuất rằng chúng có thể được sử dụng như Adapters.

Nói chung các ngôn ngữ phát triển để làm cho nhu cầu của các mẫu thiết kế ít cần thiết hơn. Có một báo giá ví dụ rằng Lisp không cần các mẫu thiết kế, bởi vì mọi thứ đều được xây dựng bằng ngôn ngữ. Vì vậy, câu hỏi đúng sẽ là, những mẫu thiết kế nào làm phương pháp mở rộng thay thế?

+1

Chính xác hơn, (tốt) ngôn ngữ có xu hướng phát triển để sắp xếp hợp lý việc sử dụng các mẫu thiết kế phổ biến. Cũng lưu ý rằng bạn không bao giờ có thể thoát khỏi việc sử dụng các mẫu thiết kế, mọi thiết kế là một mẫu thiết kế của một số loại, ngôn ngữ của các mẫu thiết kế chỉ là một cách để chính thức hóa ý tưởng này và thúc đẩy việc sử dụng các mẫu nổi tiếng và thử nghiệm nhất định (trong cùng một cách mà một vòm hoặc một trụ là một mẫu thiết kế nổi tiếng trong kiến ​​trúc). – Wedge

1

Không, nhưng các phương pháp mở rộng là tuyệt vời để triển khai các mẫu thiết kế GoF nhất định (ví dụ: Prototype).

0

Mẫu thiết kế phù hợp nhất với phương pháp mở rộng là Mẫu mặt tiền. Lý do của tôi: Chúng tôi thường sử dụng các phương pháp mở rộng để không giới thiệu chức năng mới ngoài trách nhiệm của lớp đích, nhưng đơn giản hóa việc sử dụng mục tiêu sử dụng lớp hiện tại. Bởi vì việc đơn giản hóa việc sử dụng lớp đích là mối quan tâm về mẫu mặt tiền, các phương thức mở rộng có thể được thực hiện bằng cách sử dụng mẫu Mặt tiền. Có một số vấn đề trong việc mở rộng và thử nghiệm các phương pháp mở rộng đơn vị. Vì vậy, tôi nghĩ việc triển khai thực hiện mô hình mặt tiền là một cách tiếp cận tốt hơn chống lại việc sử dụng các phương pháp mở rộng. Tuy nhiên, có thể triển khai một số phương thức mở rộng bao bọc giao diện mặt tiền để cung cấp cơ sở mã hóa cho mã máy khách.

+0

Bạn có thể giải thích câu trả lời của mình để giải thích tại sao không? – slfan