要跟踪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.
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
列。这很容易使用数据库触发器进行版本化。
PageRevisions
来存储所有页数据:a RevisionID
,Title
和Body
,而Pages
表只存储引用Slug
表格的网址RevisionID
和PageRevisions
?答案 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 。所以这根本不起作用。
你可能更有意义地告诉你为什么要这样做,因为你可能因为其他方式解决的原因而这样做。