c# - 通过转换 (ChildClass)parentObject 调用子构造函数;跟踪修订

标签 c# inheritance constructor parent-child revision

要跟踪 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 >PageRevisions 表?

最佳答案

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

相关文章:

c# - 读取混合(即文本和二进制)数据的最佳方式是什么?

sql - 获取继承表的父名称和架构

c# - 继承或标识符

java - 自定义异常中的 super 调用

c# - 从循环中动态调用图像

c# - 使用 linq 删除列表中的重复项

.net - 双重继承和抽象方法

c++ - c++错误c2440使用带有2d参数的构造函数

c# - 构造函数链接或使用命名/可选参数

c# - FTP 无法正确上传文件