2012-04-13 22 views
11

Tôi cần biết cách ngăn không cho lớp được khởi tạo trong .net?Cách tốt nhất để ngăn không cho lớp học được khởi tạo?

Tôi biết một vài phương pháp như tạo lớp Tóm tắt và Tĩnh.

Còn cách nào khác để đạt được điều này không?

+0

tại sao không trừu tượng – Trikaldarshi

+3

"Không cho phép được khởi tạo" là định nghĩa chính xác của 'lớp tĩnh'. Tại sao bạn cần cái gì khác? –

Trả lời

6

Đánh dấu hàm tạo private. Tất nhiên, điều này không ngăn cản lớp tự khởi tạo chính nó thông qua phương thức static, ví dụ:

Thực tế hơn, mục đích của việc không cho phép phân lớp là gì. Nếu cần có singleton, thì một hàm tạo private là thích hợp. Nếu nó buộc phải phân lớp, làm cho lớp abstract là tốt hơn; nếu nó có một lớp học với các phương thức tiện ích, làm cho nó trở thành một cách (sau đó bạn chỉ có thể có các phương thức static).

+1

Tôi đã làm nó nhưng nó không làm việc vẫn còn tôi có thể tạo obj. –

+2

@RomeshSomani Nó phụ thuộc vào nơi bạn đang cố gắng để tạo ra các ví dụ từ. Bạn cần phải phủ nhận nó hoàn toàn, làm cho nó trừu tượng. chỉnh sửa - Xin lỗi, tôi có nghĩa là tĩnh. – asawyer

+0

Không, trừu tượng có mục đích khác. Làm cho nó tĩnh. –

14

Đánh dấu các nhà xây dựng (s) private, protected hoặc nếu trong sử dụng từ lắp ráp khác, internal

+5

Nó vẫn có thể được khởi tạo bằng cách sử dụng sự phản chiếu. Và nếu nó không phải là một niêm phong, bạn chỉ có thể lấy được từ nó, và sau đó sử dụng các nhà xây dựng bảo vệ mà bây giờ bạn có quyền truy cập vào. – jason

+0

@Jason Đó là những điểm tốt! – asawyer

3

I need to know how to prevent a class from being Instantiated in .net?

Câu hỏi của bạn không rõ ràng.

Bạn có nghĩa là đã được khởi tạo khi chạy không? Tạo lớp học abstract hoặc static.

Bạn có nghĩa là hàm tạo không thể truy cập được trong mã không? Đặt hàm tạo là private. Nhưng lưu ý rằng ai đó vẫn có thể sử dụng sự phản chiếu để lấy một xử lý trên một hàm tạo và khởi tạo một cá thể trong thời gian chạy.

Vì vậy, ý của bạn là gì?

+0

Tôi quên mất sự phản chiếu, điểm tốt. – asawyer

+0

Tôi đã thử sử dụng Activator.CreateInstance với một hàm tạo riêng và nó đã đưa ra một ngoại lệ –

+0

@AdrianIftode Kiểm tra xem các ràng buộc của bạn có đang kéo các thành viên riêng tư hay không. – asawyer

19

Làm cho lớp tĩnh là cách tiếp cận tốt nhất, nếu bạn hoàn toàn không muốn bất kỳ trường hợp nào. Điều này dừng bất kỳ ai từ việc tạo các phiên bản. Lớp học sẽ được dán kín cả và sẽ không có bất kỳ nhà xây dựng nào.

Ngoài ra, ngôn ngữ sẽ nhận thấy rằng đó là một lớp tĩnh và ngăn bạn sử dụng nó ở những nơi khác nhau mà ngụ ý trường hợp, ví dụ: nhập đối số và biến. Điều này cho thấy ý định rõ ràng hơn là chỉ có một hàm tạo riêng - điều này có thể có nghĩa là có các cá thể, được tạo trong lớp đó (ví dụ: để triển khai thực hiện singleton).

Oh, và làm cho tĩnh lớp sẽ ngăn chặn bạn giới thiệu bất kỳ thành viên dụ vô nghĩa trong lớp, quá :)

Xem MSDN để biết thêm thông tin về các lớp học tĩnh.

+0

Điều tò mò về các lớp tĩnh, chúng không giống như các lớp học (http://codecrafter.blogspot.ca/2009/09/c-static-classes-are-not-real-classes.html); chúng giống như mô-đun ... –

2

Nếu câu hỏi là:

How can you make your class not be instanced without having your class be static or abstract ?

Sau đó, câu trả lời cho điều này là để thực hiện các singleton pattern, mà trong.NET 4+ này được thực hiện dễ dàng với:

public sealed class myClass 
{ 
    private static readonly Lazy<myClass> lazyInstance = 
     new Lazy<myClass>(() => new myClass()); 

    public static Instance 
    { 
     get 
     { 
      return lazyInstance.Value; 
     } 
    } 

    private myClass() 
    { 
     // constructor logic here 
    } 
} 

Các Singleton pattern cho phép bạn để vượt qua lớp học của bạn xung quanh như một tham chiếu đến phương pháp, trong khi vẫn đảm bảo rằng bạn chỉ có một trường hợp duy nhất của lớp học của bạn. Nó cũng làm cho thử nghiệm dễ dàng hơn nhiều khi bạn có thể có một ví dụ ImyClass mà thực hiện myClass, điều này rất hữu ích khi tạo các đối tượng giả.

Without .NET4 bạn vẫn có thể thực hiện các mô hình singleton, ví dụ:

private static readonly myClass instance = new myClass(); 

public static Instance 
{ 
    get 
    { 
     return instance; 
    } 
} 

// rest of code remains the same 

Mà không có trì hoãn tải cho đến khi nó được gọi là, có rất nhiều cách khác nữa (Tôi nghĩ khoảng 6 cách khác nhau), nhưng hai điều trên là phổ biến nhất.

Tóm lại, câu hỏi có thể hỏi bạn có biết mẫu đơn và nếu bạn nhận ra tầm quan trọng của nó đối với các lớp tĩnh đối với các bài kiểm tra đơn vị và đối tượng giả.

Khi những người khác đã chỉ ra, static trường, ngay cả những trường được đánh dấu readonly có thể được đặt bằng phản xạ, ngoài ra, hàm tạo private có thể được gọi bằng cách sử dụng sự phản chiếu. Nếu bạn cần ngăn chặn những điều này, bạn cần phải thực hiện mã gọi trong một không gian tên miền ứng dụng ít tin cậy hơn hoặc bạn sẽ cần triển khai lớp của mình là static. Nói chung, mọi người không bận tâm với mức độ phản ánh như vậy để có được xung quanh khó khăn của bạn, trừ khi họ thực sự cần phải 'ví dụ, viết các bài kiểm tra đơn vị trường hợp tối nghĩa/cực đoan rìa.

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