To track revisions of a Page
class, I have a PageRevision
class which inherits from Page
and adds a revision ID (Guid RevisionID;
).
If possible, how should I cast an existing Page
object to a PageRevision
and ensure that the PageRevision constructor is called to create a new revision ID?
I could could have a PageRevision(Page page)
constructor which generates the Guid and copies all the Page attributes, but I want to automate it, especially if a Page
class has many attributes (and I later add one, and forget to modify the copy constructor).
Desired use
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
classes:
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();
}
}
Edit based on feedback:
Besides the now-obvious (Horse)Animal;
casting problem, Jon Skeet recommends a composite revision:
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;
}
}
However, this is quite different from my data model and I'd like to keep the two as similar as possible. In my database, the PageRevisions
table has the same columns as the Pages
table, expect for an extra RevisionID
column. This is easy to version with a database trigger.
- In the light of this composite approach, would it make more sense to have a
PageRevisions
to store all page data: aRevisionID
,Title
andBody
, while aPages
table only stores an URLSlug
and aRevisionID
that refers to thePageRevisions
table?