通过强制转换(ChildClass)parentObject来调用子构造函数; 跟踪修订

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,TitleBody,而Pages表只存储一个URL SlugRevisionID引用的PageRevisions表?

Jon*_*eet 5

为什么不让你的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)