0

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

我试过:

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

基本上我想上2节课。SubClass 与具有一些附加字段的 RootClass 相同,我似乎无法对其应用值。根据逻辑,我创建一个根或子。

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

4

6 回答 6

5

基类不会知道它的子类。你所说的要么是错误的 OOP 要么是一个非常不寻常的场景,

于 2013-10-16T20:43:49.903 回答
3

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

你不能——就目前RootClass而言,SubClass不存在。

还尝试将根中的构造函数设置为虚拟,因此子构造函数可能会覆盖它

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

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

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}
}
于 2013-10-16T20:44:14.787 回答
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
    }
}
于 2013-10-16T20:47:59.970 回答
1

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

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

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

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

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

SubClass() : base() { }

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


然而,在这种情况下,您最好的设计模式是简单地继承子类。

假设 RootClass 有 memberint 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;
    }
}
于 2013-10-16T20:46:47.877 回答
1

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

class SubClass : RootClass
{
    private bool subClassfield;

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

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

于 2013-10-16T20:47:21.917 回答
0

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

于 2013-10-16T20:45:18.327 回答