2017-04-03 65 views
0

我想尽可能使一些最通用的东西。 不久,我有2个文件打印:制作通用类的泛型类

  • 所有有一个名为示范基地ThirdParty
  • 视图模型将完成该用户将输入之前启动打印

所以我” ve迄今为:

#region Models 
public abstract class ThirdParty 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

public class Student : ThirdParty 
{ public DateTime Birthday { get; set; } } 

public class Worker : ThirdParty 
{ public string Company { get; set; } } 
#endregion 

#region ViewModels 
public abstract class BaseViewModel<T> where T : ThirdParty 
{ 
    public T Model { get; set; } 
    public DateTime SelectedDate { get; set; } 
    public CultureInfo SelectedCulture { get; set; } 
} 

public class StudentViewModel : BaseViewModel<Student> 
{ public string SchoolInput { get; set; } } 

public class WorkerViewModel : BaseViewModel<Worker> 
{ public string JobInput { get; set; } } 
#endregion 

#region Document 
public abstract class Document<T> 
    where T : BaseDocumentViewModel 
{ 
    public string Template { get; protected set; } 
    public string FileName { get; protected set; } 
    public T DocumentViewModel { get; protected set; } 
} 

public class StudentDocument : Document<StudentDocumentViewModel> 
{ 
    public StudentDocument() 
    { 
     Template = "student.docx"; 
     FileName = $"{DocumentViewModel.BaseViewModel.Model.FirstName} {DocumentViewModel.BaseViewModel.Model.LastName}"; 
    } 
} 

public class WorkerDocument : Document<WorkerDocumentViewModel> 
{ 
    public WorkerDocument() 
    { 
     Template = "worker.docx"; 
    } 
} 
#endregion 

#region Document ViewModels 
public abstract class BaseDocumentViewModel 
{ 
    public BaseViewModel<ThirdParty> BaseViewModel { get; set; } 
    public string PrintingDate { get { return BaseViewModel.SelectedDate.ToString(BaseViewModel.SelectedCulture.DateTimeFormat.ShortDatePattern); } } 
} 

public class StudentDocumentViewModel : BaseDocumentViewModel 
{ 
    public StudentViewModel StudentViewModel { get; set; } 
    public int Age { get { return DateTime.Now.Year - StudentViewModel.Model.Birthday.Year; } } 
} 

public class WorkerDocumentViewModel : BaseDocumentViewModel 
{ 
    public WorkerViewModel WorkerViewModel { get; set; } 
    public string Position { get { return $"{WorkerViewModel.Model.Company} - ${WorkerViewModel.JobInput}"; } } 
} 
#endregion 

是否可以简化BaseDocumentViewModel以使其更通用?需要将BaseViewModel描述为一个属性,而专门的属性看起来不太好。

喜欢的东西:

public abstract class BaseDocumentViewModel // What to put here ? 
{ 
    public T ViewModel { get; set; } 
    public string PrintingDate { get { return ViewModel.SelectedDate.ToString(ViewModel.SelectedCulture.DateTimeFormat.ShortDatePattern); } } 
} 
// How to describe the subclasses ? 

任何暗示是值得欢迎的。

+2

太多的继承对那里发生的,恕我直言。 –

+0

我迷失在你的课堂,但为什么不只是'class BaseDocumentViewModel 其中T:ThirdParty {BaseViewModel BaseViewModel {get;组; ''?并且子类将是'class StudentDocumentViewModel:BaseDocumentViewModel ' – Evk

回答

1

您需要一个具有协变泛型参数的接口。

例如IThirdPartyViewModel<out T>

事情是这样的:

// Entities 
public abstract class ThirdParty 
{ 
} 

public class Student : ThirdParty 
{ 
} 

public class Worker : ThirdParty 
{ 
} 

// View models  
public interface IThirdPartyViewModel<out T> 
{ 
} 

public abstract class ThirdPartyViewModel<T> : IThirdPartyViewModel<T> 
{ 
} 

public class StudentVm : ThirdPartyViewModel<Student> 
{ 
} 

public class WorkerVm : ThirdPartyViewModel<Worker> 
{ 
} 

public abstract class DocumentViewModel<T> where T : IThirdPartyViewModel<ThirdParty> 
{ 
} 

public class StudentDocumentVm : DocumentViewModel<StudentVm> 
{ 
} 

public class WorkerDocumentVm : DocumentViewModel<WorkerVm> 
{ 
}