用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) ;

有人告诉我,如果不在构造函数中设置所有属性,这将不起作用。这是正确的吗?

用c#中的实例化超类调用构造函数

我希望实例化的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);
  }
}