2016-03-27 5 views
1

[Я знаю, что следующее не соблюдает правила ООП, это проект раннего dev. Я сделаю все сеттеры и геттеры позже]Как наследовать личную переменную в обработке?

У меня есть класс под названием «Item», который содержит личное поле «имя».

abstract class Item{ 
    protected PImage texture; 
    protected int durability; 
    protected int maxDurability; 

    private String name; 

} 

У меня также есть класс под названием «Броня», который наследует «Предмет». Таким образом, он должен наследовать имя «private» частного поля, верно?

class Armor extends Item{ 
    protected int defense; 

    Armor(){ 
    //First try to change the value 
    name = "Armor"; 
    //Second try using 'this' to be sure it doesn't try to change super.name 
    this.name = "Armor"; 
    } 
} 

В обоих случаях у меня есть ошибки, когда я пытаюсь изменить значение: «Поле Time_Fighter.Item.name не видно».

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

Дело в том, что если я использую 'protected', каждый класс имеет к нему доступ. Но я просто хочу, чтобы «Item» и подклассы «Item» имели доступ к их приватным полям, унаследованным от «Item».

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

[Изменить. Кажется, из ответов, которые я видел, это невозможно. Итак, есть ли способ иметь переменную, которая будет доступна только для подклассов, а не для всего пакета?]

+0

«Правильно?» Неправильно. Частные поля не наследуются. И 'protected' означает, что только подклассы (и члены одного и того же пакета, см. [Tutorial] (https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html)) могут получить к нему доступ. Тот, который разрешает доступ ко всем классам, является 'public'. – RealSkeptic

+0

@RealSkeptic, за исключением пакетов обработки, не разрешены, поэтому «защищенный» делает то же самое, что и «public». – CLOVIS

+0

Вот хороший [обманывающий лист] (http://stackoverflow.com/a/33627846/276052) для модификаторов доступа в java , – aioobe

ответ

1

Вы не можете.

Частные переменные - это просто: частные. Это означает, что подкласс не может получить к ним доступ.

Вместо этого вы можете добавить функцию setter(), которую использует подкласс.

Обычно вы просто делаете это protected, но обработка не использует пакеты, поэтому она заканчивается тем же, что и public.

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

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

abstract class Item{ 
    private PImage texture; 
    private int durability; 
    private int maxDurability; 

    private String name; 

    public Item(String name){ 
     this.name = name; 
    } 
} 

class Armor extends Item{ 
    private int defense; 

    Armor(){ 
    super("Armor"); 
    } 
} 
+0

Итак, как я могу получить переменную, что только один класс и подклассы имеют доступ к? – CLOVIS

+0

@CLOVISArtificialIntelligence Вы не можете. Самое близкое, что вы можете получить, «защищено», но это не делает тонны смысла в обработке. Это имеет смысл только в Java, который использует пакеты. В обработке ничего нет в пакете, поэтому 'protected' не имеет особого смысла. Если бы я был вами, я бы не стал беспокоиться об этом, пока вы не начнете использовать Java вместо обработки. –

+0

@CLOVISArtificialIntelligence Я отредактировал свой ответ, чтобы включить подход, который я бы взял, если бы был вами. –

0

Вы можете сделать свое name поле protected и поместите Item и Armor классов в отдельный пакет. Поля, объявленные как protected, доступны для классов того же класса пакетов и потомков.

См Controlling Access to Members of a Class

+0

Насколько я знаю, обработка не разрешает пакеты ... И я не хочу получать доступ к имени элемента, но имя Брони. – CLOVIS

+0

Извините, не знаю, что о пакетах в обработке. –

0

вы можете получить доступ ко всем классовые глобальные переменные даже частные через Reflection How do I read a private field in Java?. Я использую это много, и он работает очень хорошо. Поэтому, если кто-то действительно хочет получить доступ к переменным, он может большую часть времени.

 Смежные вопросы

  • Нет связанных вопросов^_^