наследование: доступ к массиву из суперкласса для его поиска - PullRequest
1 голос
/ 02 марта 2011

У меня есть суперкласс Trail, который заполняет массив myList[]. Я хочу, чтобы подкласс TrailSearch получил доступ к myList[] и выполнил поиск. Как я могу это сделать? Я знаю, что мог бы просто передать массив классу TrailSearch в качестве аргумента, но я пытаюсь разобраться с наследованием, поэтому я подумал, что попробую это нелегко, но мне нужны некоторые советы.

PSEUDO CODE

class Main{

 new Trail trailObject

 new TrailSearch tsearchObject

 tsearchObject.methodSearchMyList()

}


class Trail{

constructor Trail(){}

   methodPopulateMyList(){
      // populate myList[]    }

}


class TrailSearch extends Trail{

constructor TrailSearch(){}

   methodSearchMyList(){
      // search myList[]    } 

}

это более или менее как я бы подошел к этому, но каковы правила, чтобы эта идея наследования работала?

Ответы [ 4 ]

2 голосов
/ 02 марта 2011

Наследование - это неправильный способ решения этой проблемы, и эту проблему нельзя использовать, если вы пытаетесь справиться с наследованием. TrailSearch - это , а не a Trail, поэтому не следует наследовать от него.

Лучшее решение этой проблемы - шаблон посетителей: http://en.wikipedia.org/wiki/Visitor_pattern

Также см. http://msdn.microsoft.com/en-us/library/27db6csx%28v=vs.80%29.aspx для краткого объяснения отношения "Is A", которое подразумевает наследование.

0 голосов
/ 02 марта 2011

В java для каждого поля и метода вы должны объявить видимость. Это определит, кто может получить доступ к этому полю или этому методу. Видимость объявляется с помощью ключевого слова, которое является одним из следующих:

  • public: доступ к полю или методу возможен из любого места
  • private: только класс, в котором объявлено поле / метод, может получить к нему доступ
  • protected: только класс и его подкласс могут получить доступ к полю / методу.

Существует четвертая видимость, называемая «видимость пакета», которая имеет место, когда не указано ключевое слово: к полю / методу можно получить доступ в том же пакете. Эта видимость используется не очень часто.

Вот небольшой пример:

public class A {
    public int var2; // this is a public variable
    protected int var3; // this is a protected variable
    private int var1; // this is a private variable

    public void test() { } // this is a public method
    protected void test3() { } // this is a protected method
    private void test2() { } // this is a private method
}

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

В вашем случае есть два разных решения, позволяющих получить доступ к вашему полю из подкласса:

  1. объявить поле как public, protected или без видимости (т.е. видимость пакета)
  2. объявите поле как private и добавьте методы доступа setter, getter или другие. Это предпочтительный метод, и он называется инкапсуляция.

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

PS: я знаю, что инкапсуляция - это нечто большее, чем просто то, что я объяснил, но удаление такого имени не повредит OP;)

0 голосов
/ 02 марта 2011

Попробуйте определить myList [] как защищенную переменную в классе Trail, тогда вы также можете получить доступ к переменной из своего подкласса

0 голосов
/ 02 марта 2011

Пока массив myList[] не объявлен private, ваш подкласс может обращаться к нему напрямую.

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