C# 我可以简化我的课程,让它们更枯燥吗?
我有如下ViewModel类:C# 我可以简化我的课程,让它们更枯燥吗?,c#,C#,我有如下ViewModel类: public class ReferenceDetailsViewModel { public ReferenceDetailsViewModel() { this.Timer = new List<long>(); } public IEnumerable<Reference.Grid> Grid { get; set; } public List<long> Timer { g
public class ReferenceDetailsViewModel
{
public ReferenceDetailsViewModel() {
this.Timer = new List<long>();
}
public IEnumerable<Reference.Grid> Grid { get; set; }
public List<long> Timer { get; set; }
}
public class ContentDetailsViewModel
{
public ContentDetailsViewModel() {
this.Timer = new List<long>();
}
public IEnumerable<Content.Grid> Detail { get; set; }
public SelectList Statuses { get; set; }
public SelectList Types { get; set; }
public List<long> Timer { get; set; }
}
public类引用了etailsviewmodel
{
公共引用的细节视图模型(){
this.Timer=新列表();
}
公共IEnumerable网格{get;set;}
公共列表计时器{get;set;}
}
公共类ContentDetailsViewModel
{
公共内容详细信息viewmodel(){
this.Timer=新列表();
}
公共IEnumerable详细信息{get;set;}
公共选择列表状态{get;set;}
公共选择列表类型{get;set;}
公共列表计时器{get;set;}
}
它们都有一个共同的计时器字段,该字段在构造函数中初始化
是否有一种方法可以创建baseViewModel并让它们继承Timer字段,从而避免为每个具有计时器的ViewModel编码相同的内容?是的,编码一个抽象类并使具体类继承自此
public abstract class BaseDetailsViewModel
{
protected BaseDetailsViewModel() {
Timer = new List<long>();
}
public List<long> Timer { get; set; }
}
公共抽象类BaseDetailsViewModel
{
受保护的BaseDetailsViewModel(){
计时器=新列表();
}
公共列表计时器{get;set;}
}
是的,编写一个抽象类的代码,并使具体类从此类继承
public abstract class BaseDetailsViewModel
{
protected BaseDetailsViewModel() {
Timer = new List<long>();
}
public List<long> Timer { get; set; }
}
公共抽象类BaseDetailsViewModel
{
受保护的BaseDetailsViewModel(){
计时器=新列表();
}
公共列表计时器{get;set;}
}
如果我理解正确,您可以执行以下操作:
public abstract class DetailViewModelBase
{
protected DetailViewModelBase()
{
Timer = new List<long>();
}
public List<long> Timer { get; set; }
}
public class ReferenceDetailsViewModel : DetailViewModelBase
{
public IEnumerable<Reference.Grid> Grid { get; set; }
}
public class ContentDetailViewModel : DetailViewModelBase
{
public IEnumerable<Content.Grid> Detail { get; set; }
public SelectList Statuses { get; set; }
public SelectList Types { get; set; }
}
公共抽象类DetailViewModelBase
{
受保护的DetailViewModelBase()
{
计时器=新列表();
}
公共列表计时器{get;set;}
}
公共类引用的详细视图模型:DetailViewModelBase
{
公共IEnumerable网格{get;set;}
}
公共类ContentDetailViewModel:DetailViewModelBase
{
公共IEnumerable详细信息{get;set;}
公共选择列表状态{get;set;}
公共选择列表类型{get;set;}
}
使用“DetailViewModelBase”作为包含“计时器”的ViewModels的基类
尊敬的,C#er如果我理解正确,您可以执行以下操作:
public abstract class DetailViewModelBase
{
protected DetailViewModelBase()
{
Timer = new List<long>();
}
public List<long> Timer { get; set; }
}
public class ReferenceDetailsViewModel : DetailViewModelBase
{
public IEnumerable<Reference.Grid> Grid { get; set; }
}
public class ContentDetailViewModel : DetailViewModelBase
{
public IEnumerable<Content.Grid> Detail { get; set; }
public SelectList Statuses { get; set; }
public SelectList Types { get; set; }
}
公共抽象类DetailViewModelBase
{
受保护的DetailViewModelBase()
{
计时器=新列表();
}
公共列表计时器{get;set;}
}
公共类引用的详细视图模型:DetailViewModelBase
{
公共IEnumerable网格{get;set;}
}
公共类ContentDetailViewModel:DetailViewModelBase
{
公共IEnumerable详细信息{get;set;}
公共选择列表状态{get;set;}
公共选择列表类型{get;set;}
}
使用“DetailViewModelBase”作为包含“计时器”的ViewModels的基类
关于,C#er如果您可以从
Reference.Grid
和Content.Grid
提取一个通用的IGrid
接口,您可能会得到
public abstract class GridViewModel<TGrid> where T : IGrid {
protected GridViewModel() {
Timer = new List<long>();
}
public List<long> Timer { get; set; }
public IEnumerable<TGrid> Details { get; set; }
}
public class ReferenceDetailsViewModel : GridViewModel<Reference.Grid> {
}
public class ContentDetailsViewModel : GridViewModel<Content.Grid> {
public SelectList Statuses { get; set; }
public SelectList Types { get; set; }
public List<long> Timer { get; set; }
}
公共抽象类GridViewModel,其中T:IGrid{
受保护的GridViewModel(){
计时器=新列表();
}
公共列表计时器{get;set;}
公共IEnumerable详细信息{get;set;}
}
公共类引用的详细视图模型:GridViewModel{
}
公共类ContentDetailsViewModel:GridViewModel{
公共选择列表状态{get;set;}
公共选择列表类型{get;set;}
公共列表计时器{get;set;}
}
我假设您可以将
ReferenceDetailsViewModel.Grid
重命名为ReferenceDetailsViewModel.Details
,如果您可以从Reference.Grid
和Content.Grid
提取一个通用的IGrid
接口,您可能会得到
public abstract class GridViewModel<TGrid> where T : IGrid {
protected GridViewModel() {
Timer = new List<long>();
}
public List<long> Timer { get; set; }
public IEnumerable<TGrid> Details { get; set; }
}
public class ReferenceDetailsViewModel : GridViewModel<Reference.Grid> {
}
public class ContentDetailsViewModel : GridViewModel<Content.Grid> {
public SelectList Statuses { get; set; }
public SelectList Types { get; set; }
public List<long> Timer { get; set; }
}
公共抽象类GridViewModel,其中T:IGrid{
受保护的GridViewModel(){
计时器=新列表();
}
公共列表计时器{get;set;}
公共IEnumerable详细信息{get;set;}
}
公共类引用的详细视图模型:GridViewModel{
}
公共类ContentDetailsViewModel:GridViewModel{
公共选择列表状态{get;set;}
公共选择列表类型{get;set;}
公共列表计时器{get;set;}
}
我假设您可以将
ReferenceDetailsViewModel.Grid
重命名为ReferenceDetailsViewModel.Details
这可能更适合代码审阅堆栈交换:为什么您不能拥有一个视图模型继承自的抽象类ViewModel
上课?如果您发布的代码是真实的,那么您可以将共享功能丢弃到抽象基类中。这真的是您仅有的共享代码吗?如果是这样的话,试图改变它可能会以更多的工作结束。如果这只是一个例子,或者有更多的类,或者更多的工作实际上是共享的,那么这可能是值得努力的。我有很多使用计时器的类,所以我想这会使它更简单。这可能更适合代码复查stackexchange:为什么不能有一个视图模型继承自的抽象类ViewModel
?为什么不能只插入基类?如果您发布的代码是真实的,那么您可以将共享功能丢弃到抽象基类中。这真的是您仅有的共享代码吗?如果是这样的话,试图改变它可能会以更多的工作结束。如果这只是一个例子,或者有更多的类,或者更多的工作实际上是共享的,那么这可能是值得努力的。我有很多使用计时器的类,所以我想这会使它更容易。在我看来,如果在抽象类受保护的
上而不是公共的
上创建构造函数,就不会那么混乱了。(当然也可以使用内部,但这限制了访问。)@Alessandro-你同意Jeppe的观点吗?谢谢你是对的。。。复制并替换打字错误!是的,杰玛,我同意!我之前的回答是正确的,但设计很糟糕!:)在我看来,我不那么困惑