开发者

Accessing subclass in base class... but different

开发者 https://www.devze.com 2023-04-11 18:32 出处:网络
I have a base class that has a subclass (could be a struct i suppose but not sure if it\'s appropriate) and a method.

I have a base class that has a subclass (could be a struct i suppose but not sure if it's appropriate) and a method.

class Base 
{
    protected class SubClass 
    {
        public string word;
        public int number;
    }

    protected void SomeMethod()
    {
        this.SubClass.word //this is where I'm struggling
    }
}

Then i have a couple child classes that implement my baseClass, instantiate the Base.SubClass and add some values to the instantiated class.

class ChildC开发者_运维技巧lass1 : Base
{
    public childSubClass = new SubClass();

    public void DoSomethingRidiculous()
    {
        childSubClass.word = "WhoFarted";
    }
} 

class ChildClass2 : Base
{
    public childSubClass = new SubClass();

    public void DoSomethingRidiculous()
    {
        childSubClass.word = "ItStinks";
    }
}

If possible, I would like to be able to get the value of SubClass.word from within the Base class. I think that my attempt at implementing my idea is probably wrong.


I'm not sure that you really need subclassing / class nesting. Just move out class SubClass declaration and declare protected field/property of SubClass type instead.

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

Then you can access subClassInstance inside both ChildClass1 and ChildClass2


The base class has no field or property of type SubClass, so you definitely cannot do what you propose directly.

One solution would be to add the field

public childSubClass = new SubClass();

to class Base itself. Is there a problem with this?

The other solution would be to use reflection to get the value of the field, assuming that the object you are reflecting on does have such a field. This is really far-fetched and while it might technically allow you to do what you propose, it has a very bad code smell.


I'm not sure why you're making a Sub Class instead of just making those two properties of the base class, but the reason you're having trouble with this line :

this.SubClass.word //this is where I'm struggling 

is because you're not instantiating SubClass as a property of the base class.


A base class can not (or should not) access members of derived classes, and usually not even know about derived classes (some exceptions apply, such as in the case of the State Pattern). If the base should have access to a member, it should be declared in the base. If derived classes should also be able to use that member, then mark the member as protected.

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
    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消