2012-04-25 3 views
2

기본적으로 I Geometry라는 기본 클래스, 일부 파생 상품 등 Point, Polygon, 등등 ...디자인 문제는 기본 클래스는 알고 그 유도체

Geometry이 같은 방법 교차로 구현하고 있습니다

Geometry* intersection(Geometry* other) 
{ 
    Geometry* inter = compute_intersection(this, other); 

    if (inter is a polygon) 
     return new Polygon(inter); 

    if (inter is a point) 
     return new Point(inter); 
} 
을 내 프로그램의 두 기하학의 교차를 계산하면

, 나는 Geometry* 얻고 난 정말 무엇이든에 dynamic_cast 수 있습니다.

좋은 디자인입니까? 내가 생각하기에 잘못된 것은 교차점을 계산할 때마다 실제 유형을 확인하고 그 결과를 dynamic_cast (느려질 수 있음)해야한다는 것입니다. 하지만 내가 생각하는 주된 문제는이 디자인에서 Geometry은 파생물 (점, 폴리 라인 등)을 알아야한다는 것입니다.

이러한 문제를 피하기위한 좋은 해결책은 무엇입니까?

+0

추상 팩토리 디자인 패턴이 필요합니다. –

+0

@Als 그것은 순수한 공장이 아니지만 이미 구현했습니다 ... –

+0

이 코드는 어떻게 생겼습니까? 나는 당신이 전체 이야기를하지 않았다고 느낀다. –

답변

0

가 왜 반환 된 객체의 새로운 객체를 생성해야합니까, 당신은 바로 그것을 돌려 jsut 수없는 이유는 무엇입니까? 당신이하지, 단지 새로운 객체에 compute_intersection에서 결과를 래핑 각 파생 클래스에서 하나 개의 추가 메소드를 구현하고 Geometry 대신 compute_intersection의 새로운 메소드를 호출 할 수 있습니다. 내 대답에

내가 유일하게 가능한 상황을 가정 compute_intersection 추상적이며 각 파생 클래스를 구현합니다.

virtual Obj* Obj::clone() const { return new Obj(*this); } 

이 될 수 있습니다 당신은 자신이 개체를 복사하는 상속 유형에 따라 새에 필요 발견하면

0

, 당신은 객체의 복사본을 반환하는 클론() 함수를 구현하여 virtual copy constructors을 사용할 수 있습니다 intersection() 함수에서 호출됩니다.

0

내가 아는 한 여기에는 두 가지 문제가 있습니다.

첫째, 나는/세트 물건을 얻을 기능에 대한 많은 걱정하지 않는다. 나는 나를 위해 뭔가를하도록 물건을 말하는 것에 더 관심이있다.

둘째, 당신은 (이 경우 이중 파견에) 여러 파견을 구현하기 위해 노력하고 있습니다. 여기서 원하는 동작은 여러 객체의 유형에 따라 다릅니다. 캡슐화의

내 정상 만트라, 캡슐화을 캡슐화는 다음과 같은 생각으로 저를 안내 :

  • 는, 예를 들어 교차로에 수행 할 작업을 캡슐화
    • 다른 유형을 방문자 패턴
    • 봐 주어 한 종류의 파견을 캡슐화 표시 목록
  • 에 지오메트리 점을 추가 스프레드 시트 셀
  • 로 그 영역을 넣어
  • 교차로에 비헤이비어 적용 캡슐화
0

아마 당신은 boost::variant를 사용할 수 있습니다

typedef boost::variant<Point, Polygon/*, and other...*/> Geometry_Variants; 

Geometry_Variants intersection(Geometry_Variants const& other) 
{ 
    // compute the intersection and return Point or Polygon 
} 
0

귀하의 문제는 이름으로 알려져있다 : multiple dispatch 또는 multi methods을. 내가 아는 한 C + +에서이 문제에 대한 진정한 좋은 대답은 없다. 안드레이 Alexandrescu에 의해이 문제의 좋은 설명은 여기에 있습니다 :

http://books.google.fr/books?id=aJ1av7UFBPwC&pg=PA263&lpg=PA295&dq=modern+c%2B%2B+design+multiple+dispatch&source=bl&ots=YRdIZrWiaV&sig=2Vj0Blst_jmhMCAZIJ8gUiG_pl4&hl=fr&sa=X&ei=082XT86RHNS18QPW7f3mBQ&ved=0CCYQ6AEwAA#v=onepage&q&f=false

난 당신이 그것의 가격이 가치가 책을 구입하는 것이 좋습니다.