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

Is it okay to use an instance of class A as a attribute of class B

我正在开发一个小型 JAVA 游戏,我在 OOP 概念中遇到关于内聚和耦合的问题。

我有一个 class 命名位置如下

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 的接口,如下所示

public interface Locatable {
public Location getPosition();
public void setPosition(Location position);

}

和一个抽象class实现上述接口如下

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;
}
//------------------------------------------------------
//------------------------------------------------------

}

还有一个 class 扩展了上面的 class

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 class 是否不是一个好的编码感到困惑 practice.Like 它是否紧密耦合?或者可以吗?请让我澄清这个问题,因为我仍在学习 OOP。如果您要对这个问题投反对票,请在这样做之前就我错在哪里发表评论。

是的。 Location 在您的代码中紧密耦合。但是,我相信紧密耦合通用 class 不会有太大变化,如果这是您想要的方式,仍然可以。

不过,如果您想要松耦合,您可以创建 Location class 实现的接口,并在代码中的任何地方使用该接口而不是 class 名称。

然后您可以创建实现的对象并将其传递给接口名称为正式参数的方法

你要求的是组合,here你可以阅读更多关于组合而不是继承的内容。

对您的代码的评论很少:

Lotus 构造函数中你应该使用:

super(name, loc);

而不是:

this.name = name;
this.position = loc;

因为这已经在基础 class 中实现了。

当您在 class 中为属性定义 getter 时,没有理由使用 this 关键字,例如:

public int getLocationX() {
    return this.positionX;        
}

应替换为:

public int getPositionX() {
    return positionX;        
}

在您的 setter 中,好的做法是将方法及其参数命名为与 class 属性相同的名称:

public void setPositionX (int positionX){
    this.positionX = positionX;        
}

通过它您可以看到可以使用 this 关键字的内容。使用 this 你总是参考 class 属性。

我建议给自己买一本关于干净代码和 java 基础知识的书。