访问基类中的子类.但不同
本文关键字:子类 基类 访问 | 更新日期: 2023-09-27 18:10:47
我有一个基类,它有一个子类(可能是一个结构体,我想,但不确定它是否合适)和一个方法。
class Base
{
protected class SubClass
{
public string word;
public int number;
}
protected void SomeMethod()
{
this.SubClass.word //this is where I'm struggling
}
}
然后我有一对实现我的baseClass的子类,实例化的基础。子类,并向实例化的类添加一些值。
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";
}
}
如果可能的话,我希望能够得到子类的值。从基类中获取。我想我实施我的想法的尝试可能是错误的。
我不确定您是否真的需要子类化/类嵌套。只需移出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
}
}
那么您可以在ChildClass1
和ChildClass2
中访问subClassInstance
基类没有SubClass
类型的字段或属性,所以你肯定不能直接做你想做的。
public childSubClass = new SubClass();
到Base
类本身。这有什么问题吗?
另一个解决方案是使用反射来获取字段的值,假设您正在反射的对象确实有这样一个字段。这真的很牵强,虽然它可能在技术上允许您做您所建议的,但它有一个非常糟糕的代码气味。
我不知道为什么你要做一个子类而不是只做基类的这两个属性,但是你在这一行遇到麻烦的原因:
this.SubClass.word //this is where I'm struggling
是因为你没有实例化子类作为基类的属性
基类不能(或者不应该不)访问派生类的成员,而且通常甚至不知道关于派生类的信息(有一些例外,比如在状态模式的情况下)。如果基类应该对成员具有访问权限,则应该在基类中声明该成员。如果派生类也应该能够使用该成员,则将该成员标记为受保护。
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
}
}