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#?
Trả lời
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.
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.
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.
- 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à abstract
và sealed
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.)
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
- 1. Sự khác biệt giữa Giao diện, lớp trừu tượng, lớp niêm phong, lớp tĩnh và một phần lớp trong C#?
- 2. khai báo lớp trừu tượng trong C++
- 3. Tại sao lớp StringBuilder được niêm phong?
- 4. Tại sao lớp HttpServlet được khai báo là trừu tượng?
- 5. Tại sao tôi nên khai báo một destructor ảo cho một lớp trừu tượng trong C++?
- 6. Niêm phong lớp trừu tượng hoặc giao diện trong lớp .NET
- 7. Tại sao là <> niêm phong?
- 8. lớp trừu tượng tĩnh
- 9. Tại sao các phương thức giao diện C# không được khai báo trừu tượng hoặc ảo?
- 10. Biến tĩnh PHP trong lớp trừu tượng
- 11. Khi nào và tại sao bạn sẽ niêm phong một lớp học?
- 12. Tại sao các loại niêm phong nhanh hơn?
- 13. Tại sao phải khai báo biến hoặc hàm tĩnh trong C?
- 14. Java: Trường tĩnh trong lớp trừu tượng
- 15. Khai báo tín hiệu trừu tượng trong lớp giao diện
- 16. Lớp trừu tượng, tại sao chúng ta không thể khai báo thành viên lớp val và var riêng?
- 17. C# lớp trừu tượng kế thừa trường tĩnh
- 18. C++/CLI: Làm thế nào để khai báo lớp trừu tượng (trong C#) và phương thức trong C++/CLI?
- 19. C# Lớp trừu tượng triển khai Giao diện
- 20. C#, triển khai 'tóm tắt tĩnh' như các phương pháp
- 21. Tôi có thể làm cho một lớp không được niêm phong bên trong nhưng được niêm phong bên ngoài?
- 22. Whats tiện ích của các nhà thầu công khai trong các lớp trừu tượng trong C#?
- 23. Phương pháp tĩnh trong giao diện/lớp trừu tượng
- 24. trường tĩnh công khai trong lớp trừu tượng hoặc giao diện
- 25. Refactoring lớp trừu tượng trong C#
- 26. Đối với lớp ngoài chung, tại sao tôi cần khai báo lớp lồng nhau tĩnh?
- 27. Làm thế nào để khai báo các lớp trừu tượng phụ thuộc tròn trong F #
- 28. tại sao hằng số java được khai báo là tĩnh?
- 29. JAXB và lớp trừu tượng
- 30. Các khai báo biến tĩnh khác nhau trong Objective-C như thế nào?
Đó 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# –
@HenkHolterman và VB.NET, vì MustInherit và NotInheritable không thể sử dụng cùng nhau. –