我有两个类:“RootClass”和“SubClass”。 SubClass派生自RootClass。如何在RootClass中创建一个构造函数,它可以将值设置为在SubClass中找到的字段?
我试过了:
基本上我想要2节课。 SubClass与RootClass相同,还有一些额外的字段,我似乎无法应用值。 根据逻辑,我要么创建一个根或子。
显然我在这里走错路,我该怎么做?
答案 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)
一个类无法知道从中继承的所有类的实现。