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

时间:2010-04-23 11:14:15

标签: c# inheritance constructor parent-child revision

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

如果可能,应该怎么投现有Page对象到一个PageRevision,并确保PageRevision构造函数被调用以创建一个新版本ID?

我能可以有一个PageRevision(Page page)的构造,其产生的GUID,并将所有的页属性,但我要自动执行它,特别是如果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来存储所有页数据:a RevisionIDTitleBody,而Pages表只存储引用Slug表格的网址RevisionIDPageRevisions

4 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:1)

在强制转换期间,没有调用构造函数,因为该对象已经创建。

虽然您的演员表会在运行时失败,但是因为Page无法转换为PageRevision(另一种方式可能)

在您的情况下,我会将RevisionId添加到您的基类页面。如果您创建一个Page对象,可以使用Guid.Empty创建它。派生类可以使用基类Page的构造函数设置RevisionId。

public class Page {

    public Page() {
        RevisionId = Guid.Empty;
    }

    protected Page(Guid revisionId) {
        RevisionId = revisionId;
    }

    public Guid RevisionId {
        get;
        private set;
    }
}

public class PageRevision : Page {

    public PageRevision()
        : base(Guid.NewGuid()) {

    }
}

答案 2 :(得分:1)

你不能。

马是动物,但不是每匹动物都是马。

所以马=>动物是可能的,但动物=>马没有。你正试图把你的动物变成一匹马。

答案 3 :(得分:1)

无论是否将类强制转换为PageRevision,都会调用PageRevision构造函数 ALWAYS 。所以这根本不起作用。

你可能更有意义地告诉你为什么要这样做,因为你可能因为其他方式解决的原因而这样做。