Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可以使用类A的实例作为类B的属性吗_Java_Oop_Coupling - Fatal编程技术网

Java 可以使用类A的实例作为类B的属性吗

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

我正在开发一个小型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 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我对这个主题不太熟悉,我怀疑它是否会导致紧密耦合。。如果我错了,请纠正我。。谢谢你的回答,你不应该试图将每个类与其他类分离;你的代码将变成一团乱麻。您应该在合理的逻辑边界上寻求解耦,在这里您可以合理地期望将实现替换为另一个实现。谢谢您宝贵的回答。我从中学到了很多。如果你能推荐我读这本好书,那将是一个很大的帮助。谢谢你宝贵的回答。我从中学到了很多。如果你能推荐我读这本好书,那将是一个很大的帮助。谢谢你的帮助。谢谢你的帮助。有帮助