在c#中使用instanciated超类调用构造函数

时间:2014-04-30 13:00:23

标签: c# inheritance

我有这个结构。

public class SuperClass{}
public class InheritedClass : SuperClass{}

我希望我的实例化超类成为一个InheritedClass实例。

var superClassInstance = new SuperClass();
InheritedClass inHeritInstance = new InheritedClass(superClassInstance) ;

有人告诉我,如果没有在构造函数中设置所有属性,那将无法工作。 这是对的吗?

6 个答案:

答案 0 :(得分:4)

  

我希望我的实例化超类成为一个InheritedClass实例。

这是不可能的。如果您希望它是InheritedClass的实例,则必须创建一个实例。您无法向上转换SuperClass

的实例

答案 1 :(得分:1)

那是真的..你不能直接分配,在构造函数中你必须转移。

相反..

您应该创建接口并将接口实现到您传递值的类中。

现在进入InheritedClass创建构造函数,并将接口作为参数,因此无论将哪些值赋给First类,都会传递到InheritedClass

在这里,您可以完全访问First Class属性。

请参阅下面的dotnetfiddle网址。

http://dotnetfiddle.net/8AgOCF

答案 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);

Proof

答案 5 :(得分:-1)

我找到了一个解决方案,它至少可以自动复制所有属性。

public InheritedClass(SuperClass superClassInstance)
{
 foreach(var currentItem in superClassInstance.GetType().GetProperties())
  {
    GetType().GetProperty(currentItem.Name).SetValue(this,currentItem.GetValue(superClassInstance,null),null);
  }
}