如何从基类的实例创建派生类的实例并包含私有字段?

2024-01-17

我的问题有点与这个问题 https://stackoverflow.com/questions/25163478/create-an-instance-of-derived-class-from-the-base-class但更具体一点。

我有一个域对象Customer看起来像这样:

public class Customer : Party
{
    public Identity Identity {get; protected set;}
    public bool IsOrganization {get; set;}
}

和身份看起来像这样:

public class Identity : PersistableModel
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string MiddleInitial { get; set; }
    public string Title { get; set; }
    public string BusinessName { get; set; }
    public string LegalName { get; set; }
    public bool IsSynchronized { get; private set; }
}

public abstract class PersistableModel : IPersistableModel
{
    public const long UnassignedId = 0;
    public static readonly DateTime MinimumDateTime = new DateTime(1900, 1, 1);

    private readonly List<string> modifiedProperties = new List<string>();
    public virtual ModelState State { get; set; }
    public IEnumerable<string> ModifiedProperties { get { return modifiedProperties; } }
    protected bool HasModifiedProperties { get { return 0 < modifiedProperties.Count; } }
    public bool WasModified(string propertyName)
    {
        return modifiedProperties.Contains(propertyName);
    }
    public void WasModified(string propertyName, bool modified)
    {
        if (modified)
        {
            if (!WasModified(propertyName)) modifiedProperties.Add(propertyName);
        }
        else 
        {
            modifiedProperties.Remove(propertyName);
        }
    }

    public virtual void OnPersisting()
    {
    }

    public abstract void Accept(Breadcrumb breadcrumb, IModelVisitor visitor);
}

现在,根据 IsOrganization 的值,Identity 中的一些逻辑需要更改,特别是如果 IsOrganization 为 true,则个人相关字段(名字、姓氏等)需要返回 null,当为 false 时,Organization 字段需要返回 null返回空值。

以前,这是通过客户的不同实现来完成的,这些实现将在其构造函数中将身份初始化为不同的基类,但是我正在进行的更改需要删除这两种客户类型的类分离。

我的想法是 Identity 属性看起来像这样:

public override Identity Identity
{
    get
    {
         if (IsOrganization)
         {
             return OrgnaizationIdentity.FromIdentity(base.Identity);
         }
         else
         {
             return IndividualIdentity.FromIdentity(base.Identity);
         }
     } 
 }

From Identity 方法如下所示:

public static OrgnaizationIdentity FromIdentity(Identity identity)
{
    return new OrgnaizationIdentity
    {
        FirstName = identity.FirstName,
        LastName = identity.LastName,
        MiddleNameInitial = identity.MiddleNameInitial,
        Title = identity.Title
    };
}

这里的问题是原始身份对象也有一些需要返回的私有字段。

所以我的问题是,是否有一种可以接受的方式来做这样的事情?


如果您可以添加并使用一个复制构造函数,则复制构造函数可以执行此操作:

class Identity
{
    private int x;
    public Identity(Identity that)
    {
        this.x = that.x;
    }
}

class OrgnaizationIdentity : Identity 
{
    public OrgnaizationIdentity(Identity that) : base(that) { ... }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从基类的实例创建派生类的实例并包含私有字段? 的相关文章

随机推荐

  • LMDB 是否支持多个键到相同值的映射?

    是否可以将多个键映射到同一个值 如果没有 是否有解决此功能的方法 这是不可能的 我使用的一种解决方法是让第二个键上的值成为指向主键的指针 也就是第二个键的值is主键 特别是 我制作了一个辅助键表 或 lmdb 中的 命名数据库 其中所有va
  • RealmSwift 初始化器 - Xcode 修复它总是出错

    当我想为类提供初始化程序时 我无法让 Realm 工作 Xcode 不断地提示错误 我决定上传两个屏幕截图而不是代码片段 以便更容易看到错误 我遵循建议并最终得到这个 最后一个错误告诉 使用未声明的类型 RLMObjectSchema 我使
  • 使用 pandoc 生成带有 sans-serif 字体系列的 PDF

    我正在尝试使用 pandoc 从 Markdown 源生成 PDF 我希望输出仅使用无衬线字体 输入 Hello This is a test 命令行 pandoc o output pdf input md variable fontfa
  • 如果禁用 cookie 会发生什么?

    这是非常基本的问题 在 PHP 中 如果用户的浏览器禁用了 cookie 则无法同时使用服务器 cookie SESSION 和客户端 cookie COOKIE setcookie 还是只有后者被禁用 基本上你不能让用户登录或做任何需要会
  • 对于小开发团队的 HTML、CSS、Javascript 开发,您更喜欢哪种版本控制系统?

    哪种版本控制系统适合 4 名开发人员的 HTML CSS Javascript 开发 我们是 4 名开发人员 都在不同的国家 并且都有不同的操作系统 2 名开发人员拥有 Macbook 其中一台拥有 Windows 7 另一台拥有 Ubun
  • C++ 的自定义运行时类型系统/库

    在我目前正在制作的应用程序中 我有一个EventDispatcher与基础一起使用的类Event班级 调度程序不是模板化的 它适用于每个事件的运行时类型 这是为了允许脚本从基础继承Event班级并举办自己类型的活动 它也希望这个事件调度程序
  • Jetpack Compose 折叠工具栏

    我找不到关于此事的任何文件 是否有类似的内容CollapsingToolbar在撰写中 我发现的只是提及它here https developer android com jetpack compose gestures 但没有说明如何设置
  • 如何向 selenium chrome webdriver 添加多个扩展

    如何向 selenium chrome webdriver 添加多个扩展 我尝试使用逗号添加扩展名 但出现错误 chrome options add extension r C Users Administrator Desktop chr
  • Python:每三个单词分割字符串

    我已经搜索了一段时间 但似乎找不到这个小问题的答案 我有这段代码 应该在每三个单词后分割字符串 import re def splitTextToTriplet Text x re split S s 2 S Text return x p
  • 如何在 C 中通过 tcp 套接字构建协议标头和正文

    我正在写一个 tacacs 客户端 我正在尝试编写一个简单的数据包发送到服务器 我检查了RFC 页面 https datatracker ietf org doc html draft grant tacacs 02我看到协议需要在每个数据
  • 在 mamp 上运行 php [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我已经在我的 macbook pro 中安装了 MAMP 我想运行一个 php ini我能做些什么 Applications MAMP ht
  • Scala - 从 ISO-8859-1 转换为 UTF-8 会导致外来字符陌生

    这是我的问题 我有一个已转换为字节数组的输入流 但我不知道运行时输入流的字符集 我最初的想法是用 UTF 8 进行所有操作 但我发现编码为 ISO 8859 1 且包含外来字符的流存在奇怪的问题 那些疯狂的瑞典人 这是有问题的代码 IOUt
  • 配置项目“:app”时出现问题。在react-native中并给出一些字节代码作为错误

    当我运行react native应用程序时创建项目后 它给了我这个错误 FAILURE Build failed with an exception What went wrong A problem occurred configurin
  • 更改字符串的排序顺序,包括特殊字符(例如“_”)

    PHP 脚本按降序输出电子邮件地址列表 如下所示 email protected cdn cgi l email protection email protected cdn cgi l email protection email pro
  • 如何使用 Java / Scala 在内存中保存数据结构 G-wan

    我将 Gwan 视为运行 Scala 应用程序的更高性能方式 我们的用例涉及使用 Scala 数据结构在内存中保存大量数据 这比简单的哈希图要复杂一些 因此我希望避免尝试将其插入 Gwan 附带的 K V 存储中 此外 还有许多非常适合交互
  • VS 2013 看不到我的自定义签入策略

    我有通过 VSIX 部署的自定义签入策略 现在我尝试在 Visual Studio 2013 中使用它们 我做了什么 我在 VS 2013 中打开了我的策略 将 vsixmanifest 中的 安装目标 更改为 10 0 13 0 然后构建
  • Azure Devops yaml 部署管道显示不需要的消息/描述

    最近 我从传统的图形部署管道迁移到可重用的 yaml 构建和部署管道 yaml 构建管道正在交付在部署管道中使用的 多个 工件 运行部署管道 使用参数和设置 yaml 模板等时 我看到 当管道完成后 会有如下描述 由于部署管道与构建管道不在
  • 集成测试中访问内存dbcontext

    如何在集成测试中访问内存数据库的 dbcontext 我已经按照这里的代码进行操作 https learn microsoft com en us aspnet core test integration tests view aspnet
  • 将现有表上的 newid() 更改为 newsequentialid()

    目前 我们有许多表在主键上使用 newid 这导致了大量的碎片 所以我想更改该列以使用 newsequentialid 代替 我认为现有数据仍将保持相当分散 但新数据的分散程度将减少 这意味着我也许应该等待一段时间 然后再将 PK 索引从非
  • 如何从基类的实例创建派生类的实例并包含私有字段?

    我的问题有点与这个问题 https stackoverflow com questions 25163478 create an instance of derived class from the base class但更具体一点 我有一