2013-01-08 1 views
0

잘못된 방식으로이 작업을 수행 할 것이라고 확신하지만 구현할 일반 패턴이 있습니다. 특정 클래스의 인스턴스는 집합의 요소를 나타내며 클래스의 정적 메서드는 집합의 속성을 전체적으로 제공합니다. 하나의 클래스와 하나의 세트로 시작했지만, 비슷한 세트로 확장하고 모든 클래스에서 작동하는 일반적인 메소드를 갖고 싶습니다. 나는 더 많은 클래스를 만들고 그것들 모두가 동일한 인터페이스를 확장하도록 생각하고 있었지만 정적 메소드를 지정하는 인터페이스와이를 오버 라이딩하는 구현 클래스가 필요했습니다.Java에서 abstract/overridden 정적 메서드를 사용할 수 없다는 것을 알고 있지만 코드에 필요합니다.

그룹 이론을 사용하면 문제가 가장 잘 설명 될 것이라고 생각합니다. 모르는 사람들을 위해 그룹은 두 개의 요소를 결합하고 세 번째를 반환하는 그룹 연산 (*로 표시)과 함께 요소 집합으로 구성된 수학적 개체입니다. 다른 조건들 중에는 모든 e에 대해 a * e = a와 같은 요소 요소 e가 있어야하며 모든 요소 a는 a * ai = e와 같은 역 ai를 가져야합니다. 가장 간단한 예는 정수입니다. 여기서 addition은 그룹 연산이고, identity 요소는 0이며, 요소의 역함수는 부정입니다. 그룹의 요소를 조작하는 제네릭 클래스가있는 경우 그룹의 ID 요소가 무엇인지 알아야하는 경우가 있습니다. 다음 일반을

public class Integer implements GroupElement { 

    private int i; 

    public Integer(int i) { 
     this.i = i; 
    } 

    public Integer operate(Integer other) { 
     return new Integer(i + other.i); 
    } 

    public static Integer identity() { 
     return new Integer(0); 
    } 
} 

그리고 : 정수 구현이되는으로

public interface GroupElement { 

    public GroupElement operate(GroupElement element); 

    public static GroupElement identity(); 

} 

같은

그래서 그룹 내 샘플 인터페이스가있을 수 있습니다 뭔가합니다 (기존 Integer 클래스와 명백한 충돌을 무시) 요소 하나가 다른 요소의 역인 지 검사하는 객체입니다.

public class InverseChecker <E implements GroupElement> { 

    public boolean isInverse(e element1, e element2) { 
     return element1.operate(element2).equals(E.identity()); 
    } 
} 

분명히 위의 코드에는 많은 문제가 있습니다. 첫 번째 문제는 인터페이스에서 정적 메서드를 선언 할 수 없다는 것이고 추상 부모 클래스를 사용하더라도 자식 클래스가 정적 메서드를 재정의 할 수 없다는 것입니다. identity() 메서드를 정적이 아니게 만들 수는 있지만 항상 필요하지 않은 인스턴스를 필요로합니다. 또한 제네릭 타입 E에서 정적 메서드를 호출 할 수도 없습니다. 그룹과 요소의 두 인터페이스를 만들 수 있다고 가정하지만, 실제로 InverseChecker 객체와 같은 코드를 복잡하게 만드는 것처럼 보입니다 (모든 유형에 대해 두 개의 유형 매개 변수가 필요하므로 다시 작성해야합니다. 내 코드가 많고 두 인터페이스 간의 관계를 어떻게 지정해야할지 모르겠다. 또한 인터페이스를 구성하는 방식을 다른 그룹의 두 요소간에 그룹 작업을 허용해야한다는 의미로 이해하지 못한다는 사실을 알게되었습니다. 그래서, 이런 종류의 구조를 구현하는 올바른 방법은 무엇입니까?

답변

1

여기 해결책은 다른 방향으로 물건을 보는 것입니다. 그룹은 해당 요소와 별개의 개체 여야하며 그룹 개체T operate(T, T)T identity() 메서드를 가져야합니다.

다른 말로하면 GroupElement 인터페이스가있는 것을 멈추고 Group 인터페이스가 있어야합니다.

또한 제네릭을 사용하면 Group<T>의 요소가 T 인 간단한 문제를 단순화 할 수 있습니다.

+0

그래,이게 그걸하는 유일한 방법이라고 생각해. 그러나'Group '을 사용하거나'GroupElement '과 같은'GroupElement' 인터페이스를 갖는 것이 더 좋을까요? 나는 두 번째 것을 생각하고 있었고, 그룹에서 작동하는 모든 제네릭 오브젝트는 제네릭 타입의 을 가질 수 있었고 메소드는 GroupElement 과 같은 인수를 가질 수있었습니다. 그게 작동하는지 완전히 확신 할 수는 없습니다. – JaredL

1

첫 번째 문장의 절을 고려하십시오. "특정 클래스의 인스턴스는 집합의 요소를 나타냅니다." 여기에는 두 개의 문제 관련 명사 "요소"와 "집합"이 포함됩니다. 문제에 대해 더 많은 것을 배울 때 나의 초기 생각은 변화 될 것이고, Element와 Set이라는 두 개의 클래스를 가지게 될 것입니다.java.util.Set과의 혼동을 피하기 위해 "Set"의 이름을 바꿀 수도 있습니다. 이것이 Group Theory라면 "Group"이 좋은 대안이 될 것입니다.

이렇게하면 Element에 요소 관련 메서드를 넣고 Set에 관련 메서드를 설정할 수 있습니다. 두 가지 모두 서브 클래 싱 할 수 있으며 정상적인 재정의가 가능합니다.

관련 문제