Khi tôi tạo các lớp tiện ích, tôi thường tạo một lớp có một hàm tạo riêng và cho thấy tất cả các phương thức và thuộc tính của nó là tĩnh. Cách tiếp cận tốt nhất cho việc này là gì? Sự khác nhau giữa cách tôi làm hoặc tạo lớp tĩnh là gì?Lớp tĩnh Vs. Lớp với hàm tạo riêng và tất cả các thuộc tính và phương thức tĩnh?
Trả lời
Lớp tĩnh được tự động niêm phong, vì vậy mọi người không thể kế thừa và ghi đè hành vi của họ.
Đó là khác biệt duy nhất (trừ khi có cái gì đó đặc biệt trong IL)
Vì vậy, nếu bạn sử dụng một lớp tĩnh, bạn tiết kiệm cho mình những rắc rối của việc các nhà xây dựng tư nhân, và tuyên bố lớp niêm phong.
Tôi sẽ thêm, xác định lớp là tĩnh, là mã "tự tạo tài liệu". Người dùng thư viện của bạn sẽ biết rằng lớp này không nên được khởi tạo và chỉ có các giá trị tĩnh.
Một lớp tĩnh không bao giờ có thể được khởi tạo. Không đời nào, không.
Một lớp không tĩnh với một hàm tạo riêng nhưng tất cả các phương thức tĩnh có thể bị lạm dụng theo nhiều cách khác nhau - thừa kế, phản chiếu, gọi hàm tạo riêng trong một nhà máy tĩnh - để khởi tạo lớp.
Nếu bạn không bao giờ muốn thuyết minh, tôi sẽ đi với lớp tĩnh.
Edit - Làm rõ cho comment FosterZ của
Giả sử bạn có lớp tiện ích này:
public class Utility
{
public static string Config1 { get { return "Fourty Two"; } }
public static int Negate(int x) { return -x; }
private Utility() { }
}
Nếu nhà phát triển khác là không rõ ràng về ý định của mình, họ có thể làm điều này:
public class Utility
{
public static string Config1 { get { return "Fourty Two"; } }
public int Config2 { get; set; }
public static int Negate(int x) { return -x; }
private Utility() { }
/// Get an instance of Utility
public static Utility GetUtility()
{
return new Utility();
}
}
Bây giờ bạn có Frankenstei n lớp. Một số tính năng của nó yêu cầu instantiation và một số thì không. Có lẽ đó là những gì bạn muốn nhưng có lẽ nó không phải. Bạn có thể ngăn chặn điều này với việc xem xét mã, nhưng tại sao không làm cho ý định của bạn rõ ràng trong mã? Đánh dấu lớp là static
sẽ loại bỏ mọi nhầm lẫn có thể xảy ra. Bạn không thể khởi tạo một lớp tĩnh hoặc kế thừa từ nó.
bạn có thể vui lòng cho tôi một ví dụ nhỏ cho thời điểm này "gọi cho nhà xây dựng tư nhân trong một nhà máy tĩnh - để khởi tạo lớp học", m thấy khó hiểu điều này ... – FosterZ
@FosterZ - Tôi đã thêm một ví dụ vào câu trả lời của tôi. Chúc mừng. –
thnku dude rất nhiều .... bây giờ tôi nhận được nó .. – FosterZ
Ngoài các câu trả lời trước: Trình biên dịch sẽ không cho phép thành viên không tĩnh trên các lớp tĩnh và tạo và lỗi. Điều này có thể giúp một chút để vô tình thêm các thành viên không tĩnh.
Ngoài ra tôi sẽ đi với các nhà xây dựng tư nhân không bao giờ được gọi bằng các phương pháp tĩnh. Vì vậy, bất kỳ khởi tạo trong đó sẽ bị lãng phí ... Nhưng đó chỉ là một lý thuyết.
bạn có thể chuyển đối tượng của một lớp có hàm tạo riêng tư làm tham số cho bất kỳ phương thức nào nhưng bạn không thể thực hiện tương tự với lớp tĩnh. Đây là sự khác biệt lớn.
- 1. Thuộc tính tĩnh trong các lớp tĩnh
- 2. Các phương thức lớp VS Các hàm tĩnh lớp VS Các hàm đơn giản - Hiệu năng-khôn ngoan?
- 3. Lớp thành viên tĩnh - khai báo lớp riêng tư và lớp thành viên riêng tư?
- 4. Tại sao các lớp tĩnh không có các phương thức và biến không tĩnh?
- 5. AS3: gọi phương thức lớp tĩnh - tên lớp và phương thức là các chuỗi
- 6. C# Thay thế cho các phương thức tĩnh ảo và các lớp con tĩnh
- 7. Sự khác nhau giữa phương pháp cấu trúc tĩnh và phương thức lớp tĩnh là gì?
- 8. Phương thức tĩnh lớp Python
- 9. nguồn gốc lớp gọi phương thức tĩnh của lớp cơ sở trong phương pháp tĩnh của riêng mình
- 10. lớp tĩnh và singleton
- 11. Lớp tĩnh vs Singleton
- 12. Các hàm tạo PHP và hàm tĩnh
- 13. C dụ # lớp học với phương pháp tĩnh vs sử dụng bộ nhớ lớp tĩnh
- 14. Trình khởi tạo tĩnh và phương thức tĩnh Trong Java
- 15. Phương thức tĩnh và hàm mô-đun trong python
- 16. Hoàn thành tự động Eclipse với các lớp chung và các phương thức tĩnh
- 17. Lấy MethodInfo của phương thức tĩnh của một lớp tĩnh
- 18. Có thể liệt kê tất cả các lớp PHP và các phương thức và thuộc tính của chúng?
- 19. Mẫu phương thức mẫu cho các lớp tĩnh
- 20. Làm thế nào để bạn tổ chức các phương thức và thuộc tính trong một lớp?
- 21. Thừa kế PHP và phương pháp và thuộc tính tĩnh
- 22. Cách lấy tên lớp từ phương thức tĩnh tĩnh
- 23. Guice - Tiêm phụ thuộc vào một lớp với các phương thức trợ giúp tĩnh
- 24. Nhận tất cả các trường từ các lớp tĩnh bên trong lớp tĩnh với sự phản chiếu
- 25. Các phương thức mẫu và các lớp mẫu C++
- 26. Tạo thể hiện lớp từ bên trong phương thức tĩnh
- 27. @autowired trong các lớp tĩnh
- 28. xCode/khai báo các phương thức tĩnh trong lớp
- 29. Generics Java, singletons và phương thức tĩnh
- 30. Phương pháp tĩnh của một lớp tĩnh so với phương pháp tĩnh của một lớp không tĩnh (C#)
Thực sự có điều gì đó đặc biệt trong IL. Các lớp tĩnh được đánh dấu cả hai trừu tượng và niêm phong (mà không thể được thực hiện bằng cách khác từ C#) mà hoàn toàn ngăn chặn instantiation. –
Lưu ý rằng theo Mehrdad ([ở đây] (http://stackoverflow.com/questions/5241899/what-is-the-difference-between-static-methods-in-a-non-static-class-and-static -me/5241927 # 5241927)), sự khác biệt khác là các phương thức tĩnh trên các lớp không tĩnh không thể là các phương thức mở rộng. – Benjol