2014-09-27 2 views
3

저는 개별 셀이 서로 다른 데이터를 캡슐화하는 다른 유형을 가질 수있는 자바 기반 셀룰러 자동 생성과 같은 구현 (기술적으로는 확실하지 않음)과 CA 규칙. 많은 수의 유형이있을 수 있으며 다른 코드를 유지하지 않고도 새로운 유형을 동적으로 플러그 인 할 수 있기를 원합니다.Java : 입력 된 셀이있는 셀 방식 오토 마톤

모든 셀 유형은 공통 기본 클래스에서 파생됩니다. 그러나

public class CellTypeA extends Cell 
{ 
    public int Data = 0; 

    @Override 
    public void update(Cell[] neighbors) 
    { 
     Data++; 
    } 
} 

: 방법은 정확히 한 번만 시뮬레이션 프레임 당()를 호출 각 셀의 업데이트는 다음 CA의 규칙은 해당 셀의 데이터, 예를 필요로 할 때

public abstract class Cell 
{ 
    public abstract void update(Cell[] neighbors); 
} 

이 잘 작동합니다 , 나는 셀에 데이터를 위해 인접한 이웃 셀을 쿼리하도록 요구하는 시뮬레이션 규칙을 가지고 있지만 데이터를 말한 유형의 경우에만 그렇습니다. 나는 가능하면 냄새 나는 instanceof를 피하기 위해 원합니다

public class CellTypeB extends Cell 
{ 
    public boolean State = false; 

    private void update(Cell[] neighbors) 
    { 
     for (Cell c : neighbors) 
     { 
      if (c instanceof CellTypeA) 
      { 
       State = (((CellTypeA)c).getData() > 10); 
      } 
     } 
    } 
} 

:이 작업을 수행하기 위해 instanceof 연산자를 사용하는 강한 유혹이있다. 또한이 셀의 실제 데이터 구조가 다소 복잡하고 다양하기 때문에 다형성을 얻기 위해 수퍼 클래스에 getData()를 승격 할 수 없습니다. instanceof 악용을 해결하기 위해 GoF Visitor 패턴에 대해 읽었지만이 문제에 적용하는 방법을 파악할 수 없습니다. 이를 수행하는 방법이나 다른 방법으로 문제에 접근하는 것에 대한 생각?

감사합니다. 스티브

+0

상호 작용이 어느 셀에도 속하지 않은 것 같습니다. 아마도 그것을 다른 별도의 클래스에 넣고 (이웃하는) 모든 셀 쌍을 그 클래스에 전달할 것입니까? – sje397

+0

두 셀에 실제로 속해 있지 않은 상호 작용에 대해 여러분이 말하는 것을 보았습니다. 그렇다면, 거대한 switch 문에서 instanceof를 사용하여 모든 상호 작용 순열을 정의하지 않습니까? 구현 클라이언트는 새로운 상호 작용을 정의하기 위해이 클래스를 수정하거나 확장해야합니까? 아니면 내가 잘못 해석하고 있습니까? –

+0

스위치의 각 경우마다 코드에 대한 별도의 클래스를 작성하여 컬렉션에 넣을 수 있습니다. 그런 다음 상호 작용에 적용 할 셀 유형을 지정할 수있게 해주는 일종의 필터 함수가 있습니다. 그것은 당신의 문제를 정확히 피하지는 않지만 그것은 꽤 깨끗합니다. 이것은 도움이 될 수 있습니다 : http://stackoverflow.com/questions/2722343/java-select-from-collection-only-elements-of-provided-type – sje397

답변

2

나는 주위를 놀았고 방문자 패턴을 어떻게 만들 것인지 알 수 없었습니다. a) 방문 할 두 항목을 깔끔하게 처리하고 b) 필요한대로 플러그 할 수 있어야합니다.

이 작동하지만, 아마도 instanceof 구아바 내부의 물건을 숨 깁니다

import com.google.common.collect.Iterables; 
import java.util.Arrays; 

public class CellTypeB extends Cell 
{ 
    public boolean State = false; 

    @Override 
    public void update(Cell[] neighbors) { 
     Iterable<CellTypeA> onlyAs = Iterables.filter(Arrays.asList(neighbors), CellTypeA.class); 
     for(CellTypeA a: onlyAs) { 
      State = (a.getData() > 10); 
     } 
    } 
} 

추신 : 루프에 State에 값을 할당 할 때 |=을 사용 했습니까?

+0

감사! 구아바 사용 여부에 관계없이 위의 user2864740의 설명에 따라 인스턴스를 "숨길"수있는 방법을 명확히 제시합니다. –

+1

그리고 = |를 사용하려고했지만 꽤 임의적이었습니다. 실제 수행되는 작업을 나타내는 것은 아닙니다. –

관련 문제