Доступ к подклассу в базовом классе ... но отличается - PullRequest
2 голосов
/ 07 октября 2011

У меня есть базовый класс, который имеет подкласс (может быть структура, я полагаю, но не уверен, что это уместно) и метод.

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

Если возможно, я бы хотел получить значение SubClass.word из базового класса. Я думаю, что моя попытка реализовать мою идею, вероятно, ошибочна.

Ответы [ 4 ]

3 голосов
/ 07 октября 2011

Я не уверен, что вам действительно нужно вложение подклассов / классов.Просто удалите объявление класса 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 голос
/ 07 октября 2011

Я не уверен, почему вы создаете подкласс, а не просто задаете эти два свойства базового класса, но причина, по которой у вас возникают проблемы с этой строкой:

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

потому что вы не создаете экземпляр SubClass как свойство базового класса.

1 голос
/ 07 октября 2011

Базовый класс не может (или не должен не) обращаться к членам производных классов, и обычно даже не знает о производных классах (применяются некоторые исключения, например, в случае Государственный Образец). Если база должна иметь доступ к члену, она должна быть объявлена ​​в базе. Если производные классы также должны иметь возможность использовать этот член, отметьте его как защищенного.

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
    }
}
1 голос
/ 07 октября 2011

Базовый класс не имеет поля или свойства типа SubClass, поэтому вы определенно не можете делать то, что предлагаете напрямую.

Одним из решений будет добавление поля

public childSubClass = new SubClass();

к самому классу Base.Есть ли проблема с этим?

Другое решение было бы использовать отражение, чтобы получить значение поля, предполагая, что объект, от которого вы размышляете, действительно имеет такое поле.Это действительно надумано и, хотя технически может позволить вам делать то, что вы предлагаете, у него очень неприятный запах кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...