我强烈地感觉到我所寻找的东西是非常基本的东西,但现在我脑子里还没有什么聪明的东西,所以我在寻求你的帮助。
有一个基类A:
class A
{
string Code {get;set;}
}
和一个孩子责备B:
class B : A
{
DateTime ValidFrom {get;set;}
DateTime? ValidTo {get;set;}
}
想象一下,现在有一个A类实例,例如,从Repository加载:
A a = Repository.GetById(1);
获取B实例的最明智的方法是获取当前所有的值(请记住,可能会有更多属性添加到这两个类中)?这种常见模式有名称吗?
感谢您的想法。
答案 0 :(得分:3)
你真正需要的是向下转换,但不幸的是C#中不允许这样做。
一个简单的解决方案是拥有一个构造函数:
public B (A a){
...
}
答案 1 :(得分:2)
为什么不在B类中调用参数化构造函数
public class B : A
{
DateTime ValidFrom {get;set;}
DateTime? ValidTo {get;set;}
public B(string code)
{
base.Code = code;
}
}
然后你可以做
A a = Repository.GetById(1);
B b = new B(a.Code);
答案 2 :(得分:2)
如果您不想更改类的构造,可以为您的类提供复制机制:
class A
{
public string Code { get; set; }
public virtual void Copy(A other)
{
this.Code = other.Code;
}
}
class B : A
{
DateTime Start { get; set; }
DateTime? End { get; set; }
public override virtual void Copy(B other)
{
base.Copy(other);
this.Start = other.Start;
this.End = other.End;
}
}
然后使用这样的东西:
A a = new A();
a.Code = "XXX";
B b = new B();
b.Copy(a);
b.Start = DateTime.Now;
B b2 = new B();
b2.Copy(b);
答案 3 :(得分:1)
其他框架或库或编程语言具有对象层次结构,其中对象的实例可以将其字段和属性的值复制到其他对象,而不是完全相同的类对象。因为,它具有复制字段或属性的特定方法。
public class classRoot
{
public string Name { get; set; }
public virtual void assignFrom(myRootClass objSource)
{
if (objSource != null) {
this.Name = objSource.Name;
}
}
public virtual void assignTo(ref myRootClass objDest)
{
if (objDest != null) {
objDest.Name = this.Name;
}
}
}
public class classFoo: classRoot
{
public Color Color { get; set; }
public override void assignFrom(myRootClass objSource) { updateChanges(); }
public override void assignTo(ref myRootClass objDest) { updateChanges(); }
}
public class classBar: classRoot
{
public int Age { get; set; }
public override void assignFrom(myRootClass objSource) { updateChanges(); }
public override void assignTo(ref myRootClass objDest) { updateChanges(); }
}
public class classDemo
{
public void anyMethod()
{
classFoo objFoo = new classFoo("Foo1");
classFoo objBar = new classBar("Bar2");
MessageBox.Show("Name: " + objFoo);
objBar.AssignTo(ref objFoo);
MessageBox.Show("Name: " + objFoo);
}
}
不要混淆这个概念,使make成为“clone()”,或者制作“deepCopy()”或制作“shallowCopy()”,在某些情况下,使用此函数可以解决这个问题。
当您想要创建具有相同类的新对象时,这些函数会有所帮助,并且您希望将数据从现有对象复制到另一个现有对象,其中类是相关的,但可能不完全相同。 / p>
答案 4 :(得分:0)
看起来我们有另一个解决方案
参考:https://stackoverflow.com/a/14965280/371610
public class Parent
{
public string Name { get; set; }
public string City { get; set; }
//normal constructor
public Parent()
{
}
protected Parent(Parent copy)
{
this.Name = copy.Name;
this.City = copy.City;
}
}
儿童班
public class Child : Parent
{
public string NewInfo { get; set; }
public Child(Parent copy)
: base(copy)
{
}
}