2010-05-20 28 views
39

Có cách nào để ngăn chặn việc sử dụng hàm tạo mặc định không?Ngăn chặn việc sử dụng hàm tạo mặc định

Tất cả những gì tôi có thể nghĩ là ném một ngoại lệ, nhưng tôi muốn điều gì đó gây ra lỗi thời gian biên dịch.

+3

Bạn có thể chạy vào rắc rối nếu bạn làm như sau: (. Binding/serialization/etc) Trong .NET một constructor parameterless mặc định là cần thiết đối với một số thứ. Xem xét có mặc định cho bất kỳ giá trị bạn cần phải thiết lập thông qua các tham số constructor. Điều này có thể không quan trọng trong trường hợp của bạn, nhưng nó đáng nói đến. –

Trả lời

80
  • Nếu mọi thứ trong lớp là tĩnh, hãy xem xét biến nó thành lớp tĩnh. Bằng cách đó, bạn sẽ không nhận được một nhà xây dựng nào cả.
  • Nếu bạn muốn có một constructor parameterless nhưng bạn không muốn nó được công khai, kê khai nó một cách rõ ràng và làm cho nó tin (hoặc vv nội bộ)
  • Nếu bạn không muốn có một constructor parameterless nhưng làm muốn constructors với các thông số, sau đó chỉ cần khai báo những - constructor mặc định sẽ không được tạo ra cho bạn

tôi nghĩ rằng nên bao gồm tất cả các căn cứ ...

+0

Bạn nói khá nhiều chính xác những gì tôi đã chỉ cần gõ :) – Joel

+0

Tôi muốn tôi biết về các lớp học tĩnh từ lâu. – luiscubal

+1

trừ khi, nó là một cấu trúc và không phải là một lớp học. Nếu đây là trường hợp, ctor mặc định được tạo ra (một điều tốt để tất cả các đạo cụ được khởi tạo) nhưng có thể gọi (không may) - tức là tôi muốn buộc người dùng sử dụng ctor với các tham số. –

35

Biến thành riêng tư.

Vì vậy,

class SomeClass 
{ 
    private SomeClass() 
    { 
    } 

    public SomeClass(int SomeParam) 
    { 
    } 
} 
+0

+1 cho điểm. – corsiKa

+9

Trừ khi bạn cần nó trong loại (hoặc loại lồng nhau), bạn có thể loại bỏ nó hoàn toàn ở đây - nó sẽ chỉ được tạo ra nếu không có nhà thầu nào được tuyên bố rõ ràng. –

+0

@ Jon Tôi thường là một dây đeo và treo loại anh nên tôi thường làm theo cách này; theo cách đó, điều tôi đang cố gắng làm là rõ ràng đối với bất kỳ ai nhìn vào nó. Tốt để biết rằng nó được xử lý tự động bởi trình biên dịch, mặc dù, nếu tôi quên. –

8

Bạn chỉ có thể làm cho nó tin:

private MyClass() 
{ 
} 

Ngoài ra (nếu bạn không biết đã được) nếu bạn chỉ cần khai báo một constructor với các thông số, mặc định một isn Không được trình biên dịch thêm vào, ví dụ

private MyClass(string myParameter) 
{ 
    //Can't call new MyClass() anymore 
} 
5

Một điều cần lưu ý là những người khác thì không. Trình xây dựng mặc định vẫn có thể thiết lập các bit triển khai mặc định, để tránh sử dụng lại. Đây không phải là vấn đề nếu nó là riêng tư, vì bạn vẫn có thể kết nối với một nhà xây dựng riêng. Bạn chỉ làm cho nó không có sẵn cho các nguồn bên ngoài.

private MyClass() 
{ 
} 

public MyClass(string something) : this() 
{ 
} 

Điều đó giải quyết được vấn đề. Tuy nhiên, lưu ý rằng việc bảo vệ có thể thực sự là một triển khai được ưu tiên nếu lớp đó không được niêm phong.

1

Bên cạnh câu trả lời khác, bạn có thể đọc văn bản sau đây , để biết thêm thông tin về Singleton mẫu và một số ví dụ. Mẫu Singleton dựa vào hàm tạo là riêng tư.

http://www.yoda.arachsys.com/csharp/singleton.html

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