2011-02-01 4 views
1

작년에 작성자가 기본 클래스에서 정적 함수를 선언했지만 파생 클래스에 정의 된 일부 소스 코드 (C++)를 보았습니다. 위에서 언급 한 정적 함수를 정의하는 데 오직 하나의 파생 클래스 만 허용된다는 제약이 있음을 기억합니다.정적 메소드 정의가 파생 클래스에 위임되었습니다. (C++)

정적 메서드를 재정의하는 것은 불가능하다는 것을 알고 있지만,이 트릭은 내가 필요한 것입니다. 난 그냥 내 코드에서 작동하게 만들 수 없다 :) 누군가 가이 기능에 대해 알고 있습니까?

왜 이것이 유용할까요? 기본 클래스 (Shape)와 파생 클래스 (Circle, Triangle ...)가 있다고 가정합니다. Shape가 내 핵심 아키텍처의 일부이고 파생 클래스가 플러그인으로 처리된다고 가정 해보십시오. 앞으로 핵심 아키텍처를 변경하고 싶지는 않습니다. 그래서 우리는 가지고있다 :

class Shape 
{ 
    //other stuff here 
    static Shape* Factory(); 
} 

class Circle:Shape 
{ 
    //other stuff here 
    static Shape* Factory(); 
} 

셰이프는 일종의 추상 클래스이며 Factory 메서드를 구현하지 않습니다. 메서드는 파생 클래스 중 하나만 사용하여 구현됩니다. 구현에서 파생 클래스는 자체의 새 인스턴스를 반환하므로 팩토리 메서드에 불과합니다. 이 트릭은 저자가 방법 다음 클라이언트 클래스에서이 정적 메서드를 사용할 수 :

그는 같은 것을했다 생성자의 구현에서
class Client 
{ 
    public Shape* shape; 
    public Client(); 
    //other stuff here 
} 

:

Client::Client() 
:shape(Shape::Factory()) 
{   
} 

그는 "권리"를 인스턴스화 할 수 있었다이 방법을 엔진에서 핵심 클래스를 변경하지 않고 도형 파생. 코어 클래스에서 다른 모양을 사용하기를 원했을 때 파생 된 클래스에서 정적 팩토리 메서드를 정의하고 다른 파생 클래스에서 기존 팩트를 제거해야했습니다.

이렇게하면 "정적 다형성"이 있습니다. 웹에서이 기술에 대해 아무 것도 없습니다. 그것도 이름이 있습니까? 이와 같은 것이 C# 언어로 구현 될 수 있다면 특별히 관심이 있습니까? :)

미리 감사드립니다. 내 나쁜 영어로 유감스럽게 생각합니다.

답변

0

당신이하려고하는 것처럼 들리는 것은 제 의견으로는 다소 지저분합니다. Factory 클래스, Singleton을 조합 한 다음 결과 클래스 계층 구조로 다시 되돌려 보내려고합니다.

제가 생각할 수있는 가장 단순한 솔루션은 Circle::Factory() 또는 Shape::Factory()을 잊어 버리고 get_default_shape()이라는 무료 기능 만 있으면됩니다.

class Shape 
{ 
}; 

class Circle: public Shape 
{ 
}; 

Shape * get_default_shape() 
{ 
    return new Circle; 
} 

Client::Client() 
:shape(get_default_shape()) 
{ 
} 

이의 좋은 비트 Circle.h을 포함해야 get_default_shape의 유일한 구현, 모든 정의의 요구가 Shape 클래스의 전방 선언 것입니다.

+0

당신의 솔루션은 훌륭하지만, 파생 클래스의 구현을 숨기는 것 외에도 기본 클래스와 파생 클래스를 스스로 만들고 싶었습니다. 하지만 분리 된 팩토리 메서드 (기본 셰이프 가져 오기)를 사용하는 방식도 작업을 수행해야한다고 생각합니다. 감사합니다. – Kovasandra

0

흠. 나는 네가 묘사 한 것을 정확히 보지 못했다. 참조하는 코드 조각은 파생 클래스가 포함 된 cpp 파일에서 기본 클래스 정적 함수를 정의했을 수 있습니다.

// definition of Circle class 
..... 

Shape* Shape::Factory() 
{ 
    return new Circle(); 
} 

이이 예에 도움이되지 않습니다하지만 당신은 (시간 의존성을 컴파일 줄이기 위해) 클래스의 구현을 숨기고 만 추상 기본 클래스를 게시 할 경우 유용한 트릭이 될 수 있습니다. 기본 클래스와 파생 클래스가 동일한 dll/exe에 없으면 작동하지 않습니다.

C#에서는 IOC 프레임 워크를 사용하거나 제네릭을 사용하거나 기본 클래스에 delegate 팩토리를 등록하여 비슷한 결과를 얻을 수 있습니다. 나는 generics와 delegates를 선호하는 경향이있다.

+0

이 주석 삭제 – Kovasandra

+0

예, 정적 메소드는 파생 클래스의 cpp 파일에 정의되어 있습니다. 그건 내가 정확히 달성하고 싶었던 :)하지만 컴파일러가 기본 클래스가 클래스 클래스에 파생 클래스에 정적 정의를 넣을 수 없다고보고하기 때문에 내 코드에서 작동하지 못했습니다. 내 질문에 대한 답변을 같아요 : "두 클래스가 동일한 dll/exe에 있는지 확인"? :) C# 대리자와 제네릭 버전에 대해 좀 더 자세히 설명해 주시겠습니까? 미리 감사드립니다. – Kovasandra

+0

평범하고 깨끗한 테스트 프로젝트로 시도하고 재현 한 다음 결과를 게시하십시오. C#에 대해 알고 싶다면 질문이 무엇인지 생각하고 코드를 작성하여 새로운 질문으로 게시하십시오. –

관련 문제