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

How to inherit a private variable in Processing?

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

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

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

  private String name;

}

我还有一个叫做 'Armor' 的 class,它继承了 '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";
  }
}

在这两种情况下,当我尝试更改值时都出现错误:"The field Time_Fighter.Item.name is not visible"。

在阅读了一些关于 'private' 如何在 Processing 中工作的资料后,我发现有些人建议改用 'protected'。

问题是,如果我使用 'protected',每个 classes 都可以访问它。但我只希望 'Item' 和 'Item' 的子 class 能够访问从 'Item'.

继承的私有字段

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

[编辑。 从我看到的答案来看,这似乎是不可能的。所以这里有什么方法可以让一个变量只能被 subclasses 而不是所有的包访问?]

你不能。

私有变量就是:私有的。这意味着 subclass 无法访问它们。

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

通常你会做成 protected,但是 Processing 不使用包,所以它最终和 public 一样。

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

在您的情况下,您可以在 Item class 中创建一个构造函数,该构造函数将名称作为参数。然后您可以从 Armor class 调用该构造函数并传入您想要的任何值:

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

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

Controlling Access to Members of a Class

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