2009-08-12 40 views
6

This MSDN article tuyên bố rằng các lớp tĩnh phải được khai báo là đã niêm phong và trừu tượng. Tôi đã ấn tượng rằng các lớp tĩnh đã được niêm phong. Tại sao bạn cũng cần phải khai báo một lớp tĩnh như được niêm phong?Tại sao khai báo các lớp tĩnh như niêm phong và trừu tượng trong C#?

+5

Đó là một phần của câu đề cập rõ ràng đến các ngôn ngữ khác ngoài C# –

+0

@HenkHolterman và VB.NET, vì MustInherit và NotInheritable không thể sử dụng cùng nhau. –

Trả lời

23

Tôi nghĩ rằng các bit thích hợp từ bài viết đó là:

"Đừng tuyên bố lớp tĩnh như niêm phong và trừu tượng, và thêm một constructor dụ tư nhân, nếu ngôn ngữ lập trình của bạn không có built-in hỗ trợ cho các lớp tĩnh "

Hãy nhớ rằng, khung công tác .NET hỗ trợ nhiều ngôn ngữ khác nhau.

0

Dường như việc tuyên bố một lớp được niêm phong và trừu tượng với một hàm tạo riêng tư là một thay thế cho lớp tĩnh nếu ngôn ngữ không hỗ trợ các lớp tĩnh.

16

C# v1 không cho phép từ khóa 'tĩnh' trên lớp học. Vì vậy, nếu bạn có một lớp chỉ với các phương thức tĩnh, nó được đề xuất để khai báo nó là 'niêm phong', 'trừu tượng' và làm cho hàm tạo riêng. Điều này có nghĩa là không ai có thể khởi tạo lớp học của bạn hoặc cố gắng kế thừa từ đó. [Nó không có ý nghĩa để kế thừa từ một lớp học mà chỉ có phương pháp tĩnh.]

C# v2 cho phép từ khóa tĩnh trên một lớp để bạn không phải sử dụng lừa ở trên để thực thi sử dụng đúng.

11
  • Một trong những ảnh hưởng của việc đánh dấu một lớp là abstract là nó không thể được khởi tạo.
  • Một trong những tác động của việc đánh dấu một lớp là sealed là không thể được kế thừa.

Thực tế là một lớp không thể được khởi tạo và không thể được kế thừa.

Vì vậy, bài viết không cho biết bạn nên đánh dấu các lớp tĩnh của mình là abstractsealed ngoài ra, nhưng đây là cách các lớp tĩnh được trình bày trong IL.

(ngôn ngữ khác có thể cho phép bạn làm điều này nếu họ không có một từ khóa static, mặc dù tôi nghi ngờ nó, bởi vì một lớp abstract sealed không làm cho rất nhiều ý nghĩa ngữ nghĩa.)

+0

Bạn muốn thêm cho khách du lịch trong tương lai mà trong 4,0 IL, bằng cách sử dụng tĩnh, bạn sẽ có được một cái gì đó như '.class tự động ansi kín'. Vì vậy, có câu trả lời của ông là * tại sao *. Trong C# với static nó loại bỏ bất kỳ constructor mặc định nào đã được tạo ra cho bạn trong IL vì trong C# nó không thể được kế thừa. Vì vậy, tĩnh trong C# là 'ưa thích', chỉ cần hoàn thành một số câu trả lời ở trên. – Celess

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