Tôi đang tạo một trình đọc tệp phẳng chung trông giống như thế này.Tôi có thể bằng cách nào đó dọn dẹp này (lạm dụng?) Của Generics?
public class GenericReader<TComposite, THeader, TData, TTrailer>
where TComposite : GenericComposite<THeader, TData, TTrailer>, new()
where THeader : new()
where TData : new()
where TTrailer : new()
{
public TComposite Read()
{
var composite = new TComposite();
composite.Header = new THeader();
composite.Data = new TData();
composite.Trailer = new TTrailer();
return composite;
}
}
Nó có thể được tiêu thụ như vậy.
var reader = new GenericReader<Composite<Header, Data, Trailer>, Header, Data, Trailer>();
var composite = reader.Read();
Console.WriteLine(composite.Data.SomeProperty);
Console.ReadLine();
Đây là các lớp được sử dụng.
public class Composite<THeader, TData, TTrailer> : GenericComposite<THeader, TData, TTrailer>
{
}
public class GenericComposite<THeader, TData, TTrailer>
{
public THeader Header { get; set; }
public TData Data { get; set; }
public TTrailer Trailer { get; set; }
}
public class Header {
public string SomeProperty { get { return "SomeProperty"; } }
}
public class Data {
public string SomeProperty { get { return "SomeProperty"; } }
}
public class Trailer {
public string SomeProperty { get { return "SomeProperty"; } }
}
Có cách nào tôi có thể xóa hoặc đóng gói thông tin loại chung đó trong GenericReader không? Tôi đang tìm một cặp mắt bổ sung để cho tôi thấy điều gì đó mà tôi đã bỏ lỡ. Chúng tôi đã làm điều gì đó với các giao diện trả lại và khiến người tiêu dùng thực hiện một dàn diễn viên, nhưng điều đó chỉ chuyển trách nhiệm đến vị trí sai trong quan điểm của tôi, cộng với một hình phạt nhỏ về hiệu suất.
Cảm ơn.
Chỉnh sửa: Tôi không cần TComposite, tôi chỉ có thể trả về GenericComposite. Làm thế nào tôi có thể bỏ lỡ điều đó?
public class GenericReader<THeader, TData, TTrailer>
where THeader : new()
where TData : new()
where TTrailer : new()
{
public GenericComposite<THeader, TData, TTrailer> Read()
{
var composite = new GenericComposite<THeader, TData, TTrailer>();
composite.Header = new THeader();
composite.Data = new TData();
composite.Trailer = new TTrailer();
return composite;
}
}
public class GenericComposite<THeader, TData, TTrailer>
{
public THeader Header { get; set; }
public TData Data { get; set; }
public TTrailer Trailer { get; set; }
}
Bạn có thể muốn xem [mã đánh giá SE] (http://codereview.stackexchange.com/). Nó thực sự phù hợp hơn cho các nhiệm vụ đánh giá như thế này. – tmesser
Tôi nghĩ câu hỏi này phù hợp với SO; nó không phải là một đánh giá mã quá nhiều như một câu hỏi về sự phụ thuộc lẫn nhau của các đối số kiểu chung chung (và kiểu hệ thống nói chuyện chắc chắn là trên chủ đề trong SO) và cách đơn giản hóa nó .. –
Với tôi, GenericReader của bạn giống như một nhà máy sau đó là một loại chung chung, trừ khi tôi đang thiếu một cái gì đó. Âm thanh như bạn sẽ tạo ra nó chỉ để xử lý nó ngay sau đó. Vì vậy, có một lý do cho sự tồn tại của GenericReader bên cạnh việc cung cấp một Composite? Không thể hỗn hợp có một số phương pháp tĩnh để tạo ra các trường hợp của chính nó? – LightStriker