2014-11-26 1 views
0

유형 특성의 개념을 좋아합니다. 명확하고 확장 가능한 방식으로 디자인 문제를 해결하기 때문입니다. 예를 들어 두 개의 프린터 클래스와 문서 클래스가 있다고 상상해보십시오.다른 언어로 된 C++의 형질에 해당하는 기능이 있습니까?

새 문서 유형이 나중에 추가 될 수 있으므로 프린터는 인쇄 할 문서를 직접 알지 않아야하므로 조정할 필요가 없습니다. 반면에 문서는 모든 프린터에 대해 알 필요가 없습니다.

문서를 인쇄하는 방법에 대한 특성을 제공함으로써이 문서는 새 문서를 추가 할 때 수정해야하는 유일한 장소입니다. 또한 새 프린터가있는 경우 동일한 특성을 직접 사용하고 다른 프린터와 다른 내부 인쇄 프로세스에 집중할 수 있습니다.

// Documents 
class pdf { /* ... */ }; 
class txt { /* ... */ }; 

// Traits 
template<typename t> 
struct traits; // No default trait, so new documents throw compilation error 

template<> 
struct traits<pdf> { 
    static std::string get_title(pdf& document) { /* ... */ } 
    static std::string get_content(pdf& document) { /* ... */ } 
    static bool has_images = true; 
}; 

template<> 
struct traits<txt> { 
    static std::string get_title(txt& document) { return ""; } // Not supported 
    static std::string get_content(txt& document) { /* ... */ } 
    static bool has_images = false; 
}; 

// Printers 
class canon_printer : public printer { 
    template<typename T> 
    void print(T document) override 
    { 
     std::string title = traits<T>.get_title(document); 
     // ... 
     if (traits<T>.has_images) 
      // ... 
    } 
}; 

저에게는 강력합니다. 현재로서는이 개념을 C++에서만 보았습니다. 다른 프로그래밍 언어에도 비슷한 개념이 있습니까? 나는 언어의 목록보다는 언어에 독립적 인 용어를 찾고있다.

+1

예 : Java 또는 C#, Document 및 Printer는 인터페이스 또는 추상 클래스이므로 독립적으로 다양 할 수 있습니다. 원하는 답변일까요? – nos

+0

전문화 된 C++ 템플릿이있는 언어를 모르겠지만이 질문에 대답하기 위해 * 모든 * 언어를 열거 할 수 있어야합니다. –

+1

특성 (적어도 이와 유사 함)은 기본적으로 전략 패턴을 구현하지만 런타임 해석보다는 컴파일 시간을 사용합니다. 전략 패턴은 OO를 지원하는 거의 모든 언어로 구현 될 수 있습니다. –

답변

1

특성을 사용하는 대상에 따라 다릅니다. 많은 용도로, 일부 형태의 전략 패턴이 적절한 해결책이 될 것입니다. 은 컴파일 시간이 아닌 런타임 해상도를 얻게 될 것이고 실제로는 을 사용하여 유형을 정의 할 수는 없습니다.

예를 들어, 나는 C++에서도 특성을 원한다고 확신하지 못합니다. 함수 Printer::print은 분명 가상입니다 (파생 클래스에서 로 대체하므로). 또한 템플릿이기도합니다. 이것은 C++에서는 합법적이지 않습니다. C++에서 가상 함수 을 사용하여 브리지 패턴의 변형이 필요할 수 있습니다.

class PDFDocumentInformation : public DocumentInformation 
{ 
    PDFDocument const& myDocument; 
public: 
    PDFDocumentInformation(PDFDocument const& document) 
     : myDocument(document) 
    { 
    } 
    std::string get_title() const override 
    { 
     // ... 
    } 
    // ... 
    bool has_images() const override { return true; } 
}; 

당신이있어 (가상) Printer::print :

class DocumentInformation 
{ 
public: 
    virtual ~DocumentInformation() = default; 
    virtual std::string get_title() const = 0; 
    virtual std::string get_content() const = 0; 
    // ... 
    virtual bool has_images() const = 0; 
}; 

그런 다음 각 문서 유형, 당신은 구체적인 인스턴스를 도출 : 당신은, 예를 들어,의 라인을 따라 추상 기본 클래스가있을 수 있습니다 함수는 DocumentInformation const&을 취해이를 사용하여 정보가 필요합니다.

코드가 구성되는 방식에 따라 브리지가 필요하지 않을 수도 있습니다. 구체적 문 서 을 추상 Document에서 직접 파생하고 가상 함수를 사용하여이 클래스를 Printer::print에 전달하는 것이 종종 가능합니다. 실제로 이것은 보통 경우입니다 ( ). 기존의 문서 클래스가 호환되지 않는 클래스 인 경우에만 브릿지가 필요합니다.

+0

나의 예에서 실수를 보여 주셔서 감사합니다. – danijar

관련 문제