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

时间:2011-10-07 19:34:38

标签: c# polymorphism

我有一个基类,它有一个子类(可能是一个结构,但我不确定它是否合适)和方法。

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的值。我认为我实施我的想法的尝试可能是错误的。

4 个答案:

答案 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
    }
}

然后,您可以访问subClassInstanceChildClass1

中的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实例化为基类的属性。