2017-04-03 7 views
0

できるだけ一般的なものを作りたい。 まもなく、Iプリントに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を1つのプロパティと特殊なプロパティに記述する必要があるとは思われません。以下のような

何か:

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> 
{ 
} 
関連する問題