Điều này không được ngôn ngữ C# cho phép như được nêu trong phần 4.4.3 của đặc điểm kỹ thuật Loại liên kết và không được phân cách.
Nếu ràng buộc là các nhà xây dựng chế new()
, loại A
phải không abstract
và phải có một constructor parameterless công cộng. Điều này là hài lòng nếu một trong những điều sau là đúng.
A
là một loại giá trị, vì tất cả các loại giá trị có một constructor mặc định nào
A
là một tham số kiểu có chế cosntructor
A
là một tham số kiểu có kiểu giá trị hạn chế
A
là một lớp không phải là abstract
và chứa một tuyên bố rõ ràng public
constuctor không có tham số
A
không phải là abstract
và có một hàm tạo mặc định.
Lỗi trình biên dịch nếu bất kỳ điều kiện nào trong số này không được đáp ứng. Nếu bạn thấy mình có các loại công khai nhưng chỉ với các nhà xây dựng nội bộ, thì rất có thể chúng thực sự là các kiểu nội bộ với các nhà xây dựng công cộng.
Tôi khuyên bạn nên thay đổi loại trình truy cập của mình thành internal
và hàm tạo của nó là public
và làm cho nó không có tham số. Sau đó, hàm tạo public
không có tham số của bạn có thể gọi đến một hàm tạo không tham số private
hoặc internal
để thực hiện bất kỳ công việc khởi tạo bổ sung nào.
internal class C<T> where : T new()
{
public C() : this(new T()) {
}
private C(T t) {
// Do additional initialization
}
}
Nhớ rằng mẫu đó bị giới hạn, nhưng không có gì ngăn bạn sử dụng phương pháp private
thay thế.
internal class C<T> where T : new() {
public C() {
T t = new T();
InitializeClass(t);
}
private void InitializeClass(T t) {
throw new NotImplementedException();
}
}
Theo bản cập nhật của bạn, đây là ví dụ nhỏ về một đĩa đơn công khai.
public class Singleton<T> where T : new()
{
public static Singleton<T> Current {
get;
private set;
}
internal Singleton() : this(new T()) {
}
private Singleton(T t) {
Current = this;
// Do whatever you need to with T
}
public String Name {
get;
set;
}
}
Cách sử dụng
// Somewhere in your internal assembly
Singleton<String> singleton = new Singleton<String>();
// In an external assembly
Singleton.Current.Name = "SoMoS";
Bạn thậm chí không cần phải sử dụng nhà thầu trong thời trang mà một trong hai, bạn có thể cũng giống như dễ dàng làm điều gì đó đơn giản.
public class Singleton<T> where T : new()
{
public static Singleton<T> Current {
get;
private set;
}
internal Singleton() {
T t = new T();
// Do stuff with T
}
public String Name {
get;
set;
}
}
Generics thể không phải là con đường để đi nếu bạn không thể thiết kế nó để phù hợp với yêu cầu của bạn. Generics chỉ có thể làm được rất nhiều và không giải quyết mọi vấn đề. Có những thứ như Mẫu Nhà máy, Tiêm, v.v.
Làm cho lớp nội bộ và công thức xây dựng được công khai. Nếu lớp học phải được công khai, thì không bạn không thể. –