MVC 3简单继承

本文关键字:继承 简单 MVC | 更新日期: 2023-09-27 17:50:22

我遇到过一种情况,答案应该非常直截了当,但我却想不起来。

public class Note
{
    #region Properties
    public int Id { get; set; }
    public int ClientId { get; set; }
    public int CandidateId { get; set; }
    public int TypeId { get; set; }
    public DateTime DateCreated { get; set; }
    public string UserId { get; set; }
    public string UserName { get; set; }
    public string Message { get; set; }
    #endregion
    #region Methods
    public void Save()
    {
    }
    #endregion
}
public class History : Note
{
}
如您所见,History继承了Note。它们完全相同,两者之间唯一的区别是类型Id。

当从数据库获取数据时,我有这个函数

    public static Note Parse(SqlDataReader dr)
    {
        int TypeId = Convert.ToInt32(dr["TypeId"]);
        Note Note;
        if (TypeId == 1)
            Note = new Note();
        else
            Note = new History();
        Note.Id = Convert.ToInt32(dr["Id"]);
        Note.TypeId = TypeId;
        if (dr["ClientId"] != DBNull.Value) Note.ClientId = Convert.ToInt32(dr["ClientId"]);
        if (dr["CandidateId"] != DBNull.Value) Note.CandidateId = Convert.ToInt32(dr["CandidateId"]);
        Note.DateCreated = Convert.ToDateTime(dr["DateCreated"]);
        Note.UserId = Convert.ToString(dr["UserId"]);
        Note.UserName = Convert.ToString(dr["UserName"]);
        Note.Message = Convert.ToString(dr["Message"]);
        return Note;
    }

然后在我的MVC页面我有这个:

<ol id="interview-comments">                                
@foreach (Note Note in Model.Notes().OfType<Note>())
{  
}
</ol>
<ol id="history-comments">                             
@foreach (History Note in Model.Notes().OfType<History>())
{  
}
</ol>
我的问题很简单。这是正确的做法吗?

/r3plica

MVC 3简单继承

如果这就是整个情况,我不会在这里使用继承。你说Note和History条目有不同的TypeId:s.

那么我将执行以下操作:

@foreach(var item in Model.Notes().Where(x => x.TypeId == Note.NoteTypeId))
{
}
//and
@foreach(var item in Model.Notes().Where(x => x.TypeId == Note.HistoryTypeId))
{
}
public class Note
{
  public static int HistoryTypeId = 1;
  public static int NoteTypeId = 0;
  /* ... the rest of the implementation */
}

您也可以将TypeId更改为enum并"隐藏"一些魔术数字

编辑:根据使用情况,您还可以将历史记录检查作为Note的属性来实现。

public class Note
{
  /* ... other properties ... */
  public bool IsHistoric { get { return this.TypeId != 1; } }
}

然后检查将是简单的

@foreach(var note in Model.Notes().Where(x => x.IsHistoric))
{
}
// and
@foreach(var note in Model.Notes().Where(x => !x.IsHistoric())
{
}

由于HistoryNote,您的Model.Notes().OfType<Note>()也将包括History实例-这是故意的吗?

你可能只想使用一个实体,并添加一个标志来判断它是否是一个注释;这将使它更清晰,并避免继承问题。

或者您可以使用公共接口或抽象基类,而不是让类从另一个继承,而是从同一个基类继承,这也将解决OfType问题。

或者如果继承确实正确,那么像这样过滤:Model.Notes().Where(n => n.GetType()=typeof(Note)),或者只是Model.Notes().Where(n => !(n is History)) -有很多方法可以到达罗马

我这里可能没有完整的图片,但我会考虑只使用一个类- Note。在这个类上有一个属性,IsHistoric。然后根据属性而不是类型进行检查。