如何在 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
并将 Item
和 Armor
类 放入单独的包中。声明为 protected
的字段可用于同一包的 类 和后代 类。
您可以通过反射 How do I read a private field in Java? 访问所有 class-全局变量,甚至是私有变量。我经常使用它并且效果很好。因此,如果有人真的想访问变量,他大部分时间都可以访问。
[我知道以下不遵守 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
并将 Item
和 Armor
类 放入单独的包中。声明为 protected
的字段可用于同一包的 类 和后代 类。
您可以通过反射 How do I read a private field in Java? 访问所有 class-全局变量,甚至是私有变量。我经常使用它并且效果很好。因此,如果有人真的想访问变量,他大部分时间都可以访问。