2

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

如果可能,我应该如何将现有Page对象转换为 aPageRevision并确保调用 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.

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

根据反馈编辑:

除了现在显而易见的(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列。这很容易使用数据库触发器进行版本控制。

  • 鉴于这种复合方法,让 aPageRevisions存储所有页面数据是否更有意义:a和RevisionID,而table 只存储 URL和引用table 的 a ?TitleBodyPagesSlugRevisionIDPageRevisions
4

4 回答 4

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;
    }
}
于 2010-04-23T11:18:16.807 回答
1

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

虽然您的演员将在运行时失败,导致 Page 无法转换为 PageRevision (其他方式是可能的)

在您的情况下,我会将 RevisionId 添加到您的基类 Page。如果您创建一个 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()) {

    }
}
于 2010-04-23T11:18:31.687 回答
1

你不能。

马是一种动物,但并非所有动物都是马。

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

于 2010-04-23T11:18:38.027 回答
1

无论您是否将类转换为 PageRevision,都会调用PageRevision构造函数。所以这根本行不通。

告诉您为什么要这样做可能更有意义,因为您可能会出于其他方式解决的原因这样做。

于 2010-04-23T11:21:37.717 回答