Можно ли использовать экземпляр класса A в качестве атрибута класса B? - PullRequest
0 голосов
/ 21 октября 2018

Я занимаюсь разработкой небольшой JAVA-игры, и у меня возникла проблема со сплоченностью и связью в концепции ООП.

У меня есть класс с именем 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 во всем моем коде плохой практикой кодирования. Как это тесно связано?или это нормально?Пожалуйста, позвольте мне уточнить этот вопрос, так как я все еще изучаю ООП.если вы проголосуете против этого вопроса, пожалуйста, перед тем, как сделать это, прокомментируйте, где я неправ ..

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

То, что вы просите, называется составом, а здесь вы можете прочитать больше о композиции, а не наследовании.

И несколько комментариев к вашему коду:

В конструкторе Lotus вы должны использовать:

super(name, loc);

вместо:

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

Asэто уже реализовано в базовом классе.

Когда вы определяете геттеры для атрибутов в вашем классе, нет смысла использовать ключевое слово this, например:

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

Должен быть заменен на:

public int getPositionX() {
    return positionX;        
}

В ваших установщиках хорошей практикой является называть методы и их параметры так же, как атрибут класса:

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

С этим вы можете видеть, для чего может использоваться ключевое слово thisиспользуемый.С this вы всегда ссылаетесь на атрибут класса.

Я предлагаю купить себе книги о чистом коде и основах Java.

0 голосов
/ 21 октября 2018

Да. Местоположение тесно связано в вашем коде.Тем не менее, я считаю, что тесная связь универсального класса, который не сильно изменится, все еще в порядке, если вы этого хотите.

Тем не менее, если вы хотите потерять пару, вы можете создать интерфейс, который реализует класс Location ииспользуйте интерфейс везде в вашем коде вместо имени класса.

Затем вы можете создавать объекты реализации и передавать их методам, в которых имена интерфейсов являются формальными аргументами

...