我有这个结构。
public class SuperClass{}
public class InheritedClass : SuperClass{}
我希望我的实例化超类成为一个InheritedClass实例。
var superClassInstance = new SuperClass();
InheritedClass inHeritInstance = new InheritedClass(superClassInstance) ;
有人告诉我,如果没有在构造函数中设置所有属性,那将无法工作。 这是对的吗?
答案 0 :(得分:4)
我希望我的实例化超类成为一个InheritedClass实例。
这是不可能的。如果您希望它是InheritedClass
的实例,则必须创建一个实例。您无法向上转换SuperClass
。
答案 1 :(得分:1)
那是真的..你不能直接分配,在构造函数中你必须转移。
相反..
您应该创建接口并将接口实现到您传递值的类中。
现在进入InheritedClass
创建构造函数,并将接口作为参数,因此无论将哪些值赋给First类,都会传递到InheritedClass
在这里,您可以完全访问First Class属性。
请参阅下面的dotnetfiddle网址。
答案 2 :(得分:0)
是的,这是正确的。没有内置的方法来提供您自己的基类对象以提升为子类。每个子类在调用子类的构造函数之前都会构建它自己的基类。
您需要在复制所有相关数据的子类中编写自己的构造函数。
答案 3 :(得分:0)
从某种意义上说,是的,我担心这是正确的。根据定义,构造函数是创建新实例的。因此,必须将现有实例中的任何内容复制到新实例。它可能是这样的:
public InheritedClass(SuperClass superClassInstance)
{
// base fields
Field1 = superClassInstance.Field1;
Field2 = superClassInstance.Field2;
Field3 = superClassInstance.Field3;
// local fields
Field4 = "some value";
// etc.
}
或者您可以在类之间拆分工作,如下所示:
public SuperClass(superClassInstance)
{
Field1 = superClassInstance.Field1;
Field2 = superClassInstance.Field2;
Field3 = superClassInstance.Field3;
}
然后在派生类中:
public InheritedClass(superClassInstance)
: base(superClassInstance)
{
Field4 = "some value";
// etc.
}
相反,从SuperClass
创建InheritedClass
变得容易得多,因为InheritedClass
的任何实例都是 {{1}的实例并且可以多态地解释为:
SuperClass
(请注意,这将不成为"新实例"因此请注意参考错误。)您可能能够做同样的事情相反:
SuperClass someObject = inheritedClassInstance as SuperClass;
但无保证 InheritedClass someObject = superClassInstance as InheritedClass;
也是superClassInstance
的一个实例,因此您需要在此检查错误。而且,这不是一个新的例子。
使用组合而不是继承,您可以用更少的代码实现目标。例如,如果您有这样的类:
InheritedClass
然后你可以在public class InheritedClass
{
public SuperClass BaseObject { get; private set; }
// other fields
}
中包含一个构造函数,它只设置一个对象:
InheritedClass
但是,请注意,这不是属性中public InheritedClass(SuperClass superClassInstance)
{
BaseObject = superClassInstance;
}
的 new 实例,而是对现有实例的引用。要确保新版本,您仍然需要编写手动代码(可能是SuperClass
上的.Copy()
或.Clone()
方法?)来复制实例。
简而言之,在我所有的无方向头脑风暴之后,逐个克隆一个实例将需要在某处放置逐字段代码。
答案 4 :(得分:0)
好的,这里(a和b字段用于演示目的):
public class SuperClass
{
object a;
public SuperClass()
{
a = "123";
}
// you need to have this
public SuperClass(SuperClass copy)
{
a = copy.a;
}
}
public class InheritedClass : SuperClass
{
object b;
public InheritedClass()
{
Init();
}
// and this
public InheritedClass(SuperClass super): base(super)
{
// bacause you can't call base() and this()
Init();
}
private void Init()
{
b = "456";
}
}
所以你可以做到
var super = new SuperClass();
var inherited = new InheritedClass(super);
答案 5 :(得分:-1)
我找到了一个解决方案,它至少可以自动复制所有属性。
public InheritedClass(SuperClass superClassInstance)
{
foreach(var currentItem in superClassInstance.GetType().GetProperties())
{
GetType().GetProperty(currentItem.Name).SetValue(this,currentItem.GetValue(superClassInstance,null),null);
}
}