Trong C# là có thể tạo một lớp có thể được lấy từ nội bộ (chưa được niêm phong), nhưng sau đó ngăn cản người khác tham khảo thư viện của tôi từ bên ngoài kế thừa từ lớp công khai của tôi (niêm phong)?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?
Trả lời
Tôi giả sử bạn có thể tạo hàm tạo của lớp internal
để chỉ các lớp khác trong assembly có thể lấy được từ chúng, nếu bạn vẫn cần tạo các thể hiện của lớp đó, bạn có thể cung cấp phương thức factory để trả về các cá thể.
chỉnh sửa để thêm một mẫu:
public class MyFoo
{
internal MyFoo()
{
}
public static MyFoo CreateFoo()
{
return new MyFoo();
}
}
Eric Lippert nhấn mạnh ba cách để làm điều này. tl; dr: không niêm phong lớp của bạn, nhưng bao gồm một phương thức trừu tượng nội bộ trong lớp của bạn, hoặc làm cho tất cả các nhà xây dựng nội bộ hoặc riêng tư, hoặc sử dụng thuộc tính PermissionSet
để thêm siêu dữ liệu vào lớp.
Bạn cũng có thể thử làm một cái gì đó như thế này.
internal class InternalExtendible
{
public string MyProperty { get; set; }
}
public sealed class ExternalSealedClass : InternalExtendible
{
}
Tạo lớp nội bộ và tạo lớp trống công khai kế thừa từ lớp nội bộ. Khi tham chiếu dll, chỉ có lớp công khai sẽ được hiển thị cho người dùng, nhưng tất cả các chức năng của lớp bên trong sẽ được hiển thị.
Xảy ra cho tôi, nhưng vấn đề lớn là nếu có phương pháp tiếp cận công cộng tiêu thụ hoặc trả lại loại này - chữ ký là gì? Nếu bạn sử dụng 'ExternalSealedClass', những người kế thừa" thực sự "của bạn sẽ không đủ điều kiện. Nếu bạn sử dụng 'InternalExtensible', phương thức của bạn không thể công khai được nữa. – mquander
@mquander Bạn không thể làm được điều đó bằng cách lập trình cho một giao diện? tức là chữ ký của bạn sẽ trông giống như "void DoSomething (IExtendableOrSealed item) {...}" – Michael
- 1. Tại sao lớp StringBuilder được niêm phong?
- 2. java.lang.SecurityException: niêm phong vi phạm:
- 3. Tại sao là <> niêm phong?
- 4. Không thể được niêm phong bởi vì nó không phải là một override
- 5. Tại sao loại lớp không được niêm phong và tôi có thể làm gì với điều đó?
- 6. Cách đánh máy mạnh mẽ cho các chuỗi hoặc các lớp được niêm phong khác
- 7. Tôi có nên sử dụng lớp niêm phong hoặc Enumeration ở Scala?
- 8. Mocking một phương thức trả về một lớp niêm phong trong RhinoMocks
- 9. Làm thế nào để xử lý một lớp bạn muốn mở rộng được niêm phong trong thư viện .NET?
- 10. Niêm phong lớp trừu tượng hoặc giao diện trong lớp .NET
- 11. Tại sao các loại niêm phong nhanh hơn?
- 12. Khi nào và tại sao bạn sẽ niêm phong một lớp học?
- 13. Tại sao khai báo các lớp tĩnh như niêm phong và trừu tượng trong C#?
- 14. Sự khác nhau giữa một lớp có hàm tạo riêng và lớp niêm phong có hàm tạo riêng là gì?
- 15. 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#?
- 16. Làm cho một lớp NotInheritable trong VB.NET cung cấp các tối ưu hóa trình biên dịch tương tự (tiềm năng) như được niêm phong trong C#?
- 17. Tại sao tất cả các bộ sưu tập bất biến cơ bản cuối cùng hoặc được niêm phong trong scala?
- 18. Làm thế nào bạn có thể kế thừa từ một lớp niêm phong bằng cách sử dụng sự phản chiếu trong .Net?
- 19. phong cách liên kết bên trong một div với một lớp học cụ thể
- 20. Sử dụng javascript để có được phong cách của một phần tử từ một file css bên ngoài
- 21. Làm thế nào để đối phó với một lớp niêm phong khi tôi muốn kế thừa và thêm các thuộc tính
- 22. Java - Trình tạo lớp bên trong - chỉ được phép cho lớp bên ngoài
- 23. Nexus 10 - trả cho rendertarget bên ngoài chỉ hoạt động trong phong cảnh
- 24. Định nghĩa của enums bên ngoài cơ thể lớp học nhưng bên trong không gian tên
- 25. Làm thế nào tôi có thể cho một phong cách đậm trong android?
- 26. Có thể chỉ định tên lớp cho Spring Framework trong một tệp bên ngoài không?
- 27. Tôi có thể thay đổi bảng từ bên trong ra bên ngoài trong tổ ong không?
- 28. Lớp bên trong truy cập lớp bên ngoài
- 29. Ánh xạ khóa ngoài bên trong lớp có thể nhúng
- 30. từ khóa cho các lớp bên ngoài từ một lớp bên trong vô danh
Làm mát tuyệt vời. Cảm ơn! –