Java 可以使用类A的实例作为类B的属性吗
我正在开发一个小型JAVA游戏,我遇到了OOP概念中的内聚和耦合问题 我有一个名为Locations的类,如下所示Java 可以使用类A的实例作为类B的属性吗,java,oop,coupling,Java,Oop,Coupling,我正在开发一个小型JAVA游戏,我遇到了OOP概念中的内聚和耦合问题 我有一个名为Locations的类,如下所示 public class Location { private int positionX; private int positionY; public Location(int positionX, int positionY){ this.positionX=positionX; this.positionY=positionY; } public void
public class Location {
private int positionX;
private int positionY;
public Location(int positionX, int positionY){
this.positionX=positionX;
this.positionY=positionY;
}
public void updateLocation(int positionX, int positionY){
this.positionX=positionX;
this.positionY=positionY;
}
public String getLocation(){
return (positionX+","+positionY);
}
public int getLocationX(){
return this.positionX;
}
public int getLocationY(){
return positionY;
}
public void setLocationX(int positionX){
this.positionX=positionX;
}
public void setLocationY(int positionY){
this.positionY=positionY;
}
}
我有一个名为locatable的接口,名为bellow
public interface Locatable {
public Location getPosition();
public void setPosition(Location position);
}
以及实现上述接口的抽象类,如下所示
public abstract class GameObject implements Locatable{
protected String name;
protected Location position;
public GameObject(String name, Location position){
this.name=name;
this.position=position;
}
//------------- getter & setters for positions----------
@Override
public Location getPosition(){
return position;
}
@Override
public void setPosition(Location position){
this.position=position;
}
//------------------------------------------------------
//------------------------------------------------------
//------------- getter & setters for name ---------------
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
//------------------------------------------------------
//------------------------------------------------------
}
以及一个扩展上述类的类
public class Lotus extends GameObject{
private int no_of_Petals=100;
public Lotus(String name,Location position){
super(name,position);
}
//-----getters & setters for no of petals --------
public void setNoOfPetals(int no_of_Petals){
this.no_of_Petals=no_of_Petals;
}
public int getNoOfPetals(){
return no_of_Petals;
}
//------------------------------------------------
//------------------------------------------------
}
所以我对在我的代码中使用Location类是否不是一个好的编码实践感到困惑,比如它是紧密耦合的吗?还是可以?请让我澄清这个问题,因为我还在学习OOP。如果你打算否决这个问题,请在投票前就我的错误提出意见 是的位置在代码中紧密耦合。然而,我相信紧耦合的泛型类不会有太大的变化,如果您希望这样做的话,仍然可以 不过,如果您希望松散耦合,可以创建Location类实现的接口,并在代码中的任何地方使用该接口,而不是使用类名
然后,您可以创建实现的对象,并将其传递给接口名称为形式参数的方法位置在代码中紧密耦合。然而,我相信紧耦合的泛型类不会有太大的变化,如果您希望这样做的话,仍然可以 不过,如果您希望松散耦合,可以创建Location类实现的接口,并在代码中的任何地方使用该接口,而不是使用类名
然后,您可以创建实现的对象,并将其传递给接口名称为形式参数的方法,您要求的是组合,您可以阅读有关组合而非继承的更多信息 对代码的注释也很少: 在
Lotus
构造函数中,您应该使用:
super(name, loc);
而不是:
this.name = name;
this.position = loc;
因为这已经在基类中实现了
为类中的属性定义getter时,没有理由使用this
关键字,例如:
public int getLocationX() {
return this.positionX;
}
应替换为:
public int getPositionX() {
return positionX;
}
在setters中,好的做法是将方法及其参数命名为与class属性相同的名称:
public void setPositionX (int positionX){
this.positionX = positionX;
}
有了它,你可以看到这个
关键字可以用来做什么。使用此
时,您总是引用class属性
我建议给自己买一本关于干净代码和java基础知识的书。你想要的是所谓的组合,你可以阅读更多关于组合而不是继承的书 对代码的注释也很少: 在
Lotus
构造函数中,您应该使用:
super(name, loc);
而不是:
this.name = name;
this.position = loc;
因为这已经在基类中实现了
为类中的属性定义getter时,没有理由使用this
关键字,例如:
public int getLocationX() {
return this.positionX;
}
应替换为:
public int getPositionX() {
return positionX;
}
在setters中,好的做法是将方法及其参数命名为与class属性相同的名称:
public void setPositionX (int positionX){
this.positionX = positionX;
}
有了它,你可以看到这个
关键字可以用来做什么。使用此
时,您总是引用class属性
我建议给自己买一本关于干净代码和java基础知识的书。你有什么理由相信你不应该这样做吗?@JonathonReinhart我对这个主题不太熟悉,我怀疑它是否会导致紧密耦合。。如果我错了,请纠正我。。谢谢你的回答,你不应该试图将每个类与其他类分离;你的代码将变成一团乱麻。您应该在合理的逻辑边界上寻求解耦——在这里您可以合理地期望将实现换成另一个实现。您有任何理由相信您不应该这样做吗?@JonathonReinhart我对这个主题不太熟悉,我怀疑它是否会导致紧密耦合。。如果我错了,请纠正我。。谢谢你的回答,你不应该试图将每个类与其他类分离;你的代码将变成一团乱麻。您应该在合理的逻辑边界上寻求解耦,在这里您可以合理地期望将实现替换为另一个实现。谢谢您宝贵的回答。我从中学到了很多。如果你能推荐我读这本好书,那将是一个很大的帮助。谢谢你宝贵的回答。我从中学到了很多。如果你能推荐我读这本好书,那将是一个很大的帮助。谢谢你的帮助。谢谢你的帮助。有帮助