访问基类中的子类.但不同

本文关键字:子类 基类 访问 | 更新日期: 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
    }
}

那么您可以在ChildClass1ChildClass2中访问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
    }
}