【问题标题】:Create child object in parent constructor在父构造函数中创建子对象
【发布时间】:2011-05-22 22:18:19
【问题描述】:

是否可以使用父对象的构造函数创建子对象的实例并传递某种参数(在本例中为字符串)来告诉它应该创建的子对象的类型?

【问题讨论】:

  • 子对象的类型是否继承自父对象的类型?如果是这样,您正在寻找工厂方法。
  • +1 奥利弗:听起来对我来说也绝对像工厂。

标签: c# oop inheritance constructor


【解决方案1】:

没有。在 C# 中,您创建一个类的实例,然后运行时调用它的构造函数。当构造函数执行时,选择另一种类型为时已晚。

但是,派生类的构造函数总是调用其基类的构造函数之一,您可以利用它来发挥自己的优势(避免重复代码)。

人们经常创建factories 来做您所说的事情。例如,给定 ParentChild1:ParentChild2:Parent 类,您可以这样编写工厂:

public class ParentFactory {
    public Parent CreateParent(string type) {
        switch(type) {
            case "Child1":
                return new Child1();
            case "Child2":
                return new Child2();
            default:
                throw new ArgumentException("Unexpected type");
        }
    }
}

【讨论】:

    【解决方案2】:

    如果我对您的理解正确,您想创建一个类 A 和一个派生自 A 的类 B。那么你想调用new A("B"),这应该会返回一个新的 B 对象吗?

    这是不可能的。

    但是,我不知道您要完成什么,但也许您应该查看 reflection,因为它允许您通过名称字符串创建类的实例。

    http://msdn.microsoft.com/en-us/library/dex1ss7c.aspx

    var obj = myAssembly.CreateInstance("myNamespace.myClassB");
    

    【讨论】:

      【解决方案3】:

      不确定我是否理解正确,但这是我理解的:)

      public class parent:child
      {
          private child childObj;
          public parent(string childName)
          {
              childObj = new child(childName);
          }
      
      }
      public class child
      {
          private string name;
      
          public child(string _name)
          {
              name = _name;
          }
      }
      

      【讨论】:

      • 不完全是。它与 GenericTypeTea 提供的答案相同,这不是我想要的。
      猜你喜欢
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-31
      • 2012-02-05
      相关资源
      最近更新 更多