我的问题与this question有关,但更为具体。
我有一个看起来像这样的域对象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);
}
}
}
“从身份”方法如下所示:
public static OrgnaizationIdentity FromIdentity(Identity identity)
{
return new OrgnaizationIdentity
{
FirstName = identity.FirstName,
LastName = identity.LastName,
MiddleNameInitial = identity.MiddleNameInitial,
Title = identity.Title
};
}
这里的问题是原始身份对象具有一些私有(private)字段,这些私有(private)字段也需要返回。
所以我的问题是,做这样的事情是否被接受?
最佳答案
如果可以添加并使用一个复制构造函数,则可以执行此操作:
class Identity
{
private int x;
public Identity(Identity that)
{
this.x = that.x;
}
}
class OrgnaizationIdentity : Identity
{
public OrgnaizationIdentity(Identity that) : base(that) { ... }
}