为了跟踪Page类的修订,我有一个PageRevision类,该类继承自Page并添加了修订ID(Guid RevisionID;)。

如果可能,如何将现有的Page对象强制转换为PageRevision并确保调用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.


PagePageRevision类:

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();
    }
}


根据反馈进行编辑:

除了现在很明显的(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;
    }
}


但是,这与我的数据模型有很大不同,我想使两者尽可能相似。在我的数据库中,PageRevisions表的列与Pages表的列相同,期望有额外的RevisionID列。这很容易通过数据库触发器进行版本控制。


根据这种复合方法,使用PageRevisions存储所有页面数据(RevisionIDTitleBody)更有意义,而Pages表仅存储URL 和引用Slug表的RevisionID

最佳答案

为什么不让您的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;
    }
}

关于c# - 通过强制转换(ChildClass)parentObject来调用子构造函数;跟踪修订,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2698041/

10-09 04:37