첫째, 질문 제목에 대해 유감 스럽지만 문제를 더 잘 설명 할 수는 없습니다. 자유롭게 변경할 수 있습니다 :)이 간단한 계층 구조 Java 문제에 대한 최선의 접근 방법은 무엇입니까?
자,이 추상 클래스 Box
은 몇 가지 생성자, 메소드 및 일부 개인 변수를 구현합니다. 그런 다음 BoxA
및 BoxB
과 같은 몇 가지 하위 클래스가 있습니다. 이 두 가지 모두 여분의 일을 구현합니다.
다른 추상 클래스 Shape
과 Square
및 Circle
과 같은 몇 가지 하위 클래스가 있습니다. BoxA
내가 Shape
개체의 목록이 필요하지만, 난 단지 Square
객체가 BoxA
로 이동의 목록 만 Circle
객체가 BoxB
에 들어갈 '의 목록에 있는지 확인해야 BoxB
모두 들어
.
(각 상자에) 그 목록은, 나는 또한 get()
및 set()
방법 및 addShape()
및 removeShape()
방법이 필요합니다.
알아둬야 할 또 다른 중요한 점은 각각의 상자가 생성 될 때 각각 BoxA
또는 BoxB
이고 각각 각각 Shape
목록이 동일하다는 것입니다. 예를 들어 Square
의 이름이 ls
이고 두 개의 BoxA
이라는 객체가 boxA1
및 boxA2
인 경우를 예로 들어 보겠습니다. 무엇을해도 boxA1
과 boxA2
은 모두 ls
목록이어야합니다.
이
내 생각 : 목록으로public abstract class Box {
// private instance variables
public Box() {
// constructor stuff
}
// public instance methods
}
public class BoxA extends Box {
// private instance variables
private static List<Shape> list;
public BoxA() {
// constructor stuff
}
// public instance methods
public static List<Square> getList() {
List<Square> aux = new ArrayList<Square>();
for(Square s : list.values()) {
aux.add(s.clone()); // I know what I'm doing with this clone, don't worry about it
}
return aux;
}
public static void setList(List<Square> newList) {
list = new ArrayList<Square>(newList);
}
public static void addShape(Square s) {
list.add(s);
}
public static void removeShape(Square s) {
list.remove(list.indexOf(s));
}
}
객체의 유형에 대해 동일해야합니다, 나는 static
로 선언하고 그 목록에 근무하는 모든 방법은 static
이다. 자, BoxB
의 경우 클래스는 목록 항목과 거의 동일합니다. 나는 Square
을 Triangle
으로 바꾸고 문제가 해결되었습니다. 따라서 각각의 BoxA
개체가 생성 될 때 목록은 하나만 같을 것입니다. BoxB
개체가 만들어지기는하지만 각기 다른 유형의 목록이있는 경우에도 마찬가지입니다.
그래서 내 문제는 무엇입니까? 글쎄, 나는 코드를 좋아하지 않는다 ... BoxA
과 BoxB
에 대해 getList()
, setList()
, addShape()
및는 기본적으로 반복된다. 목록이 보유 할 객체의 유형 만 다르다. 어떻게 든 모든 방법을 "중복"하는 것을 피하고 싶었습니다.
나는 대신 수퍼 클래스 Box
에서 할 수있는 방법을 생각할 수 없다. 또한 Square
또는 Triangle
대신 Shape
을 사용하여 정적으로 처리하려고하면 목록이 모든 BoxA
및 BoxB
개체 중 하나 일 뿐이므로 하나만 사용해야하지만 각 하위 클래스는 Box
이어야합니다.
어떻게 다르게 할 수 있습니까?
P.S : 내가하는 일에 대해 정확한 영어 단어를 모르기 때문에 실제 사례를 설명 할 수 없으므로 방금 상자와 모양 예제를 사용했지만 기본적으로 동일합니다.
Box를 제네릭 형식으로 제안했지만 일반 정적 메서드는 사용할 수 없습니다. – Powerlord
리스트가 정적이 아닌 경우 제네릭을 사용할 수 있습니다. 상자를 생성하고 상자 생성자에서 목록을 전달하는 팩토리를 만듭니다. – Beothorn
그건 여전히 상자 당 목록을 만들 것이고 나는 그것을 원하지 않을 것입니다. 그렇지 않니? 어쨌든, 나는 그런 것을 배우지 않았으므로 그것을 사용하지 않아야한다. –