如何在Processing中继承私有变量?

时间:2016-03-27 18:11:40

标签: java inheritance processing private protected

[我知道以下不遵守OOP规则,这是一个早期开发项目。我稍后会做所有的安装者和吸气剂]

我有一个名为' Item'的课程,其中包含一个私人字段' name'。

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

  private String name;

}

我还有一个名为' Armor'的类,它继承了' Item'。所以它应该继承私人领域' name',对吧?

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不可见"。

在阅读了一些关于私人'在Processing,我发现有些人建议使用' protected'代替。

问题是,如果我使用' protected',每个类都可以访问它。但我只想要' Item'以及'项目'的子类有权访问继承自' Item'。

的私人字段

我可能做了一个非常明显的错误,因为我只是一个初学者,所以如果这不是预期的方式,请告诉我我应该怎么做...

[编辑。 从我已经看到的答案来看,这种方式是不可能的。那么,有没有办法让一个变量只能被子类访问而不是所有的包?]

3 个答案:

答案 0 :(得分:1)

你不能。

私有变量只是:私有。这意味着子类无法访问它们。

您可以改为添加子类使用的setter()函数。

通常你只需要它protected,但是处理不使用包,因此它最终与public相同。

老实说,我不会太担心这个。处理旨在使事情变得简单,因此它略微超过了这个主题。如果你真的想要这个功能,可以考虑编写Java代码(可以调用Processing代码),但这比直接编写Processing更加复杂。

在您的情况下,您可以在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");
  }
}

答案 1 :(得分:0)

您可以创建name字段protected,并将ItemArmor类放入单独的包中。声明为protected的字段可用于相同包和后代类的类。

请参阅Controlling Access to Members of a Class

答案 2 :(得分:0)

您可以通过Reflection How do I read a private field in Java?访问所有类全局变量,甚至是私有变量。我经常使用它,它工作得很好。因此,如果有人真的想要访问他大部分时间都可以使用的变量。