2016-07-27 2 views
2

최근에 나는 composite pattern에 대해 알게되었습니다. 파일과 폴더 클래스를 구현해야하는 과제에서 사용하고 싶습니다. CFileCfolder 같은 하위 클래스는 동일한 속성 (namesize)을 가져야한다는 것을 알고 있습니다. 그렇다면 속성을 interface에 입력하는 것이 좋습니다. 내가 아는 한 그렇게하는 것은 좋은 습관이 아닙니다. 그러나, 나는 왜해서는 안되는 지 이해하지 못한다. 아니면 다른 해결책이 있습니까? Class Diagram데이터 멤버를 인터페이스에 두어도 괜찮습니까?

+0

C++가 뚜렷한 "인터페이스"단지 추상 클래스가 없습니다를 참조하십시오. 예를 들어 인터페이스에서. Java는 변수를 가질 수 없습니다. – deviantfan

+0

공개 필드로 추상 기본 클래스 (C++의 인터페이스 없음)에 저장하는 경우 필드를 최신 상태로 유지하기 위해 파생 클래스의 구현 자에게 암시적인 부담을가합니다. 기본 클래스에 가상 (순수) 게터로 넣으면 구현자가 해당 클래스에 대해 생각하게 만듭니다. –

답변

2

나는 그다지 문제가 없다고 말할 것이다. 차이점은 순수 인터페이스 클래스 대신 추상 기본 클래스이 있다는 점입니다. 그러나 인터페이스을 특정 멤버 변수에 묶이지 않은 구현에 사용하려면 항상 인터페이스 클래스추상 기본 클래스을 만들 수 있습니다. 너무 지나치게 지나치게 복잡해지기는하지만 나중에 인터페이스추상 자료에서 분할 할 수 있습니다.

using CItemUPtr = std::unique_ptr<class CItem>; 

/** 
* Interface class 
*/ 
class CItem 
{ 
public: 
    virtual ~CItem() {} 

    virtual CItemUPtr findByName(std::string const& name) = 0; 
    virtual void setHidden(bool a, bool b) = 0; 
}; 

/** 
* Abstract base class 
*/ 
class AbstractCItem 
: public CItem 
{ 
protected: 
    std::string name; 
    std::size_t size; 
}; 

class CFile 
: public AbstractCItem 
{ 
public: 

    CItemUPtr findByName(std::string const& name) override 
    { 
     // stuff 
     return {}; 
    } 

    void setHidden(bool a, bool b) override {} 
}; 
3

실제로는 "좋은 사례입니까?"라는 질문이 아닙니다. 인터페이스를 작성하면 표준을 정의하게됩니다. 문제는 그러한 데이터 멤버를 포함 할 인터페이스의 구현이 필요합니까? 당신은 당신의 구현을 이해하는 가장 좋은 위치에 있으므로, 당신은 정말로 이것을 대답 할 수있는 유일한 사람입니다.

일반적으로 인터페이스를 구현하는 클래스는 블랙 박스 여야하며 외부 세계는 멤버 데이터를 포함하여 내부에 액세스해서는 안됩니다. 인터페이스는 인터페이스를 지원할 수 있어야하는 공통 기능을 정의하며, 이러한 구현 세부 사항이 일반적으로 클래스의 기본 구현에만 포함될 것으로 기대합니다. YMMV.

0

클래스의 설계 원칙은 다음과 같아야합니다 생성자 (들) 클래스를 불변 설정하면

'그것은 불가능 외부에서 불변 클래스를 휴식', 그리고 모든 회원
클래스 불변성을 유지하면됩니다.

그러나 클래스에 클래스 불변성이 없으면
명의 공용 멤버가 같은 것을 성취합니다.

// in C++, this is a perfectly fine, first order class 
struct Pos 
{ 
    int x,y; 
    Pos& operator+=(const Pos&); 
}; 

https://en.wikipedia.org/wiki/Class_invariant

+1

이것은 인터페이스와 어떤 관련이 있습니까? –

관련 문제