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

时间:2018-10-21 12:20:22

标签: 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 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);

}

还有一个将上述接口实现为波纹管的抽象类

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的知识。如果您要对此问题投反对票,请在执行此操作之前先评论一下我哪里错了。

2 个答案:

答案 0 :(得分:2)

是的。 位置与您的代码紧密结合。但是,我相信如果需要的话,紧密耦合不会发生太大变化的泛型类仍然可以。

如果您仍然想松散耦合,则可以创建Location类实现的接口,并在代码中的所有位置(而不是类名)使用该接口。

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

答案 1 :(得分:0)

您所要求的是合成,here您可以了解更多关于合成而不是继承的信息。

对代码的注释很少:

Lotus构造函数中,您应该使用:

super(name, loc);

而不是:

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

这已经在基类中实现了。

在类中为属性定义吸气剂时,无需使用this关键字,例如:

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

应替换为:

public int getPositionX() {
    return positionX;        
}

在设置方法中,好的做法是将方法及其参数命名为类属性:

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

由此,您可以看到可以使用this关键字的内容。对于this,您总是引用类属性。

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