繁体   English   中英

如何设置派生类的字段?

[英]How to set the fields of a derived class?

我有2类:“ RootClass”和“ SubClass”。 子类是从RootClass派生的。 如何在RootClass中创建一个构造函数,该构造函数可以将值设置为SubClass中的字段?

我试过了:

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

基本上我想有2节课。 子类与RootClass相同,但具有一些其他字段,我似乎无法对其应用值。 根据逻辑,我可以创建根或子目录。

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

基类不会知道它的子类。 您所说的是错误的面向对象操作或非常不寻常的情况,

如何在RootClass创建构造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}
}

也许您正在寻找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
    }
}

您不能从根类访问派生类的任何成员。

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

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

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

然后,派生类将需要一个构造函数

SubClass() : base() { }

这样可以确保调用根类构造函数,然后调用其自己的init方法。


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

假设RootClass具有成员int a和Subclass 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;
    }
}

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

class SubClass : RootClass
{
    private bool subClassfield;

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

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

一个类不能知道从其继承的所有类的实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM