我有一个基类,它有一个子类(可能是一个结构,但我不确定它是否合适)和方法。
class Base
{
protected class SubClass
{
public string word;
public int number;
}
protected void SomeMethod()
{
this.SubClass.word //this is where I'm struggling
}
}
然后我有几个实现我的baseClass的子类,实例化Base.SubClass并将一些值添加到实例化的类中。
class ChildClass1 : Base
{
public childSubClass = new SubClass();
public void DoSomethingRidiculous()
{
childSubClass.word = "WhoFarted";
}
}
class ChildClass2 : Base
{
public childSubClass = new SubClass();
public void DoSomethingRidiculous()
{
childSubClass.word = "ItStinks";
}
}
如果可能,我希望能够从Base类中获取SubClass.word的值。我认为我实施我的想法的尝试可能是错误的。
答案 0 :(得分:3)
我不确定你真的需要子类化/类嵌套。只需移出类SubClass
声明并声明SubClass
类型的受保护字段/属性。
public class SubClass
{
public string word;
public int number;
}
public class Base
{
protected SubClass subClassInstance = new SubClass();
protected void SomeMethod()
{
this.subClassInstance.word //this is where I'm struggling
}
}
然后,您可以访问subClassInstance
和ChildClass1
ChildClass2
答案 1 :(得分:1)
基类没有SubClass
类型的字段或属性,所以你绝对不能直接做你的建议。
一种解决方案是添加字段
public childSubClass = new SubClass();
到班级Base
本身。这有问题吗?
另一个解决方案是使用反射来获取字段的值,假设您正在反射的对象确实具有这样的字段。这真的很牵强,虽然它可能在技术上允许你做你的建议,它有一个非常糟糕的代码味道。
答案 2 :(得分:1)
基类不能(或者 不能)访问派生类的成员,并且通常甚至不知道知道派生类(某些例外适用,例如国家格局的案例)。如果基础应该可以访问成员,则应该在基础中声明它。如果派生类也应该能够使用该成员,则将该成员标记为受保护。
class Base
{
protected Foo someFoo;
void Frob()
{
// can access methods/properties of someFoo instance
}
}
class Child
{
public Child()
{
someFoo = new Foo(); // child can also access someFoo
}
}
答案 3 :(得分:1)
我不确定你为什么要创建一个Sub Class而不是仅仅创建基类的这两个属性,但是你遇到这个问题的原因是:
this.SubClass.word //this is where I'm struggling
是因为您没有将SubClass实例化为基类的属性。