2012-01-04 6 views
1

나는 기하학적 인체를 그리는 일종의 명령 기반 응용 프로그램을 만들고 있습니다. 따라서 사용자가 RECT 100, 50, 200, 120과 같은 것을 입력하면 그리기 패널의 지정된 위치에 사각형을 그립니다.기하학적 인 함수의 인덱스

이렇게하려면 RECTg.drawRect(100, 50, 200, 120);으로 매핑하고 이와 유사한 모든 기능을 기하학적 인물로 그릴 필요가 있습니다.

맵핑을 위해 해시 맵을 사용 하겠지만 java에서 함수 배열을 빌드하는 방법을 모르겠습니다. C++에서는이 작업을 수행했습니다.

키는 'RECT'일 수 있고 값은 인덱스의 오프셋입니다.

어떻게 이러한 기능을 색인화 할 수 있는지 알려주십시오. 아니면 주요 관심 사항을 해결할 더 좋은 방법이 있습니까?

답변

5

Java에 함수 포인터가 없으므로 상속 및/또는 인터페이스를 통해 수행해야합니다. 드로잉 코드에서

Map<String,Shape> shapes = new HashMap<String,Shape>(); 
shapes.put("POLY", new Polygon()); 
shapes.put("CIRC", new Circle()); 

: 메인 프로그램의 생성자 또는 static 초기화

interface Shape { 
    void draw(int[] data); 
} 

class Polygon implements Shape { 
    public void draw(int[] data) { 
     // Draw polygon using points data[i], data[i+1] for points 
    } 
} 

class Circle implements Shape { 
    public void draw(int[] data) { 
     // Draw circle using data[0], data[1] for the center, and data[2] for radius 
    } 
} 

예를 들면 다음과 같습니다 내가 인정해야

shapes.get("CIRC").draw(new int[] {100, 100, 50}); 
+0

와우 내 염려가 사라진 것 같습니다! 이것은 내가 가지고있을 수있는 가장 우아한 코드 조각입니다! –

+0

@VinayakGarg 이제 구문 오류도 수정했다고 생각합니다. 3 년 넘게 Java를 작성하지 않아서 C# 구문이 내 선언에 몰래 들어 왔습니다. – dasblinkenlight

+0

절대 신경 쓰지 마세요! 내 IDE는 구문 오류를 처리합니다 :) 저는 논리에 더 관심이 있습니다. –

3

, 정말하지 않았다 귀하의 디자인을 가지고, 왜 당신이 말한대로 기능의 배열이 필요할지 모르겠지만,이게이 일이 자바에서 할 수있는 방법입니다.

Function (Java 용어의 메서드)은 Java의 "first-class-sitizen"이 아니기 때문에 (적어도 Java 7에서는) 메서드 배열을 작성할 수 없습니다. 할 수있는 일은 객체 지향 접근 방식을 사용하는 것입니다. 인터페이스를 정의하면 각 메소드가 인터페이스 구현 (클래스)이되어 인터페이스 구현 배열을 저장할 수 있습니다. 배열 대신 배열을 사용하여 디자인 패턴을 사용합니다. 도움이 되었으면합니다.

+0

네 도움이됩니다. 감사! 내 Java 지식을 발전 시키려면 그러한 도움이 필요하다고 생각합니다. –

+0

** Java 7에서 Java의 ** 기능을 제거하지 않은 경우 ** ** Reflection **을 사용하여 ** 메소드의 배열을 만들 수 있습니다. (http://docs.oracle.com/javase/tutorial/reflect/member/methodInvocation.html) Java에서 문제를 해결하는 좋은 방법이라고 생각지 않지만, 이렇게 해. –

관련 문제