Pet*_*ron 2 c# inheritance constructor revision parent-child
为了跟踪Page类的修订,我有一个PageRevision继承自Page并添加修订ID(Guid RevisionID;)的类.
如果可能,我应该如何将现有Page对象PageRevision强制转换为a 并确保调用PageRevision构造函数来创建新的修订版ID?
我可以有一个PageRevision(Page page)生成Guid 的构造函数并复制所有的Page属性,但我想自动化它,特别是如果一个Page类有很多属性(后来我添加一个,忘了修改复制构造函数).
Page page = new Page(123, "Page Title", "Page Body"); // where 123 is page ID
PageRevision revision = (PageRevision)page;
// now revision.RevisionID should be a new Guid.
Run Code Online (Sandbox Code Playgroud)
Page,PageRevision班级:public class Page
{
public int ID { get; set; }
public string Title { get; set; }
public string Body { get; set; }
}
public class PageRevision : Page
{
public Guid RevisionID { get; set; }
public PageRevision()
{
this.RevisionID = Guid.NewGuid();
}
}
Run Code Online (Sandbox Code Playgroud)
除了现在明显的(Horse)Animal;铸造问题,Jon Skeet还建议进行复合修订:
public class PageRevision : Page
{
private readonly Page page;
private readonly Guid id;
public Guid RevisionID { get { return id; } }
public Page Page { get { return page; } }
public PageRevision(Page page)
{
this.id = Guid.NewGuid();
this.page = page;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这与我的数据模型完全不同,我希望尽可能保持两者的相似性.在我的数据库中,该PageRevisions表与表具有相同的列Pages,期望有一个额外的RevisionID列.这很容易使用数据库触发器进行版本控制.
PageRevisions存储所有页面数据:一RevisionID,Title和Body,而Pages表只存储一个URL Slug和RevisionID引用的PageRevisions表?为什么不让你的PageRevision类组成而不是继承呢?
public class PageRevision : Page
{
private readonly Page page;
private readonly Guid id;
public Guid RevisionID { get { return id; } }
public Page Page { get { return page; } }
public PageRevision(Page page)
{
this.id = Guid.NewGuid();
this.page = page;
}
}
Run Code Online (Sandbox Code Playgroud)