如何设置派生类的字段?

时间:2013-10-16 20:41:02

标签: c# constructor

我有两个类:“RootClass”和“SubClass”。 SubClass派生自RootClass。如何在RootClass中创建一个构造函数,它可以将值设置为在SubClass中找到的字段?

我试过了:

  • 从根的构造函数中设置子类的值,但它没有看到子类的字段。
  • 在SubClass中创建一个似乎不会发生的构造函数。还尝试将root中的构造函数设置为virtual,因此子构造函数可以覆盖它,也没有运气。
  • 在RootClass的构造函数中实例化SubClass,这看起来很愚蠢。

基本上我想要2节课。 SubClass与RootClass相同,还有一些额外的字段,我似乎无法应用值。 根据逻辑,我要么创建一个根或子。

显然我在这里走错路,我该怎么做?

6 个答案:

答案 0 :(得分:5)

基类不会知道它的子类。你所说的是错误的OOP或非常不寻常的情况,

答案 1 :(得分:3)

  

如何在RootClass中创建构造函数,可以将值设置为SubClass

中的字段

您不能 - 就RootClass而言,SubClass不存在。

  

还尝试将root中的构造函数设置为virtual,因此子构造函数可以覆盖它

你不能 - 构造函数不是继承的,所以没有“虚拟”构造函数的概念。

这是“链接”构造函数的典型模式:

public class RootClass 
{
    public RootClass(int rootProperty)
    {
        this.RootProperty = rootProperty;  
    }

    public int RootProperty {get; set;}
}
public class SubClass : RootClass
{
                                                           v--- call the base constructor
   public SubClass(int rootProperty, string subProperty) : base(rootProperty)
   {
       this.SubProperty = subProperty; 
   }

   public string SubProperty {get; set}
}

答案 2 :(得分:2)

也许您正在寻找SubClass调用RootClass构造函数的方法?

public class RootClass
{
    public RootClass(int foo)
    {
    }
}

public class SubClass: RootClass
{
    public SubClass(int foo)
    : base(foo)   // calls RootClass constructor
    {
        // now set Subclass fields
    }
}

答案 3 :(得分:1)

您无法从根类访问派生类的任何成员。

典型的设计模式是创建方法:

virtual void Init(int a, int b) {}

在基类中,其中参数是派生类执行自我初始化所需的任何信息。从根类的构造函数中调用它。

派生类将需要构造函数

SubClass() : base() { }

这将保证调用根类构造函数,然后调用它自己的init方法。


但是,在这种情况下,您最好的设计模式就是简单地进行子类化。

假设RootClass有成员int a和子类int b

class RootClass {

    int a;

    RootClass(int a) {
        this.a = a;
    }
}

class SubClass {

    int b;

    SubClass(int a, int b) : base(a) {
        this.b = b;
    }
}

答案 4 :(得分:1)

通常,基类不应该了解其子类的实现细节。您应该能够在子类中提供自己的构造函数来实例化其字段,如下所示:

class SubClass : RootClass
{
    private bool subClassfield;

    public SubClass() : base()
    {
        subClassField = true;
    }
}

这不能按预期工作吗?注意: base()表达式,它确保SubClass的构造函数调用基类的构造函数,以保证在继续之前初始化基类。

答案 5 :(得分:0)

一个类无法知道从中继承的所有类的实现。