[我知道以下不遵守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'。
的私人字段我可能做了一个非常明显的错误,因为我只是一个初学者,所以如果这不是预期的方式,请告诉我我应该怎么做...
[编辑。 从我已经看到的答案来看,这种方式是不可能的。那么,有没有办法让一个变量只能被子类访问而不是所有的包?]
答案 0 :(得分:1)
你不能。
私有变量只是:私有。这意味着子类无法访问它们。
您可以改为添加子类使用的setter()
函数。
通常你只需要它protected
,但是处理不使用包,因此它最终与public
相同。
在您的情况下,您可以在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
,并将Item
和Armor
类放入单独的包中。声明为protected
的字段可用于相同包和后代类的类。
答案 2 :(得分:0)
您可以通过Reflection How do I read a private field in Java?访问所有类全局变量,甚至是私有变量。我经常使用它,它工作得很好。因此,如果有人真的想要访问他大部分时间都可以使用的变量。