用c#中的实例化超类调用构造函数
本文关键字:超类 调用 构造函数 实例化 | 更新日期: 2023-09-27 18:00:52
我有这个构造。
public class SuperClass{}
public class InheritedClass : SuperClass{}
我希望实例化的Superclass成为InheritedClass实例。
var superClassInstance = new SuperClass();
InheritedClass inHeritInstance = new InheritedClass(superClassInstance) ;
有人告诉我,如果不在构造函数中设置所有属性,这将不起作用。这是正确的吗?
我希望实例化的Superclass成为InheritedClass实例。
这是不可能的。如果希望它是InheritedClass
的实例,则必须创建一个。不能对SuperClass
的实例进行升频转换。
确实如此。。你不能直接分配,在构造函数中你必须转移。
相反。。
您应该创建接口并将接口实现到传递值的类中。
现在,在InheritedClass
中创建一个以接口为参数的构造函数,所以无论分配给First类的值是什么,都将被传递到InheritedClass
中
在这里,您可以完全访问一流的房产。
请参阅下面的dotnetfiddle网址。
http://dotnetfiddle.net/8AgOCF
是的,这是正确的。没有内置的方式来提供您自己的基类对象来提升到子类。在调用子类的构造函数之前,每个子类都将构建自己的基类
您需要在复制所有相关数据的子类中编写自己的构造函数。
从某种意义上说,是的,恐怕这是正确的。根据定义,构造函数就是创建一个新实例。因此,现有实例中的任何内容都必须复制到新实例中。可能是这样的:
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.
}
相反,从InheritedClass
创建SuperClass
会变得容易得多,因为InheritedClass
的任何实例都是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;
}
但是,请再次注意,这不是属性中SuperClass
的新实例,而是对现有实例的引用。为了确保有一个新的实例,您仍然需要编写手动代码(可能在SuperClass
上的.Copy()
或.Clone()
方法中(来复制该实例。
简言之,在我进行了所有无方向的头脑风暴之后,逐个字段克隆实例需要将该字段逐个字段的代码放在的某个地方。
好的,这里(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);
证明。
我找到了一个解决方案,它至少可以自动复制所有属性。
public InheritedClass(SuperClass superClassInstance)
{
foreach(var currentItem in superClassInstance.GetType().GetProperties())
{
GetType().GetProperty(currentItem.Name).SetValue(this,currentItem.GetValue(superClassInstance,null),null);
}
}