최근에 나는 composite pattern
에 대해 알게되었습니다. 파일과 폴더 클래스를 구현해야하는 과제에서 사용하고 싶습니다. CFile
과 Cfolder
같은 하위 클래스는 동일한 속성 (name
및 size
)을 가져야한다는 것을 알고 있습니다. 그렇다면 속성을 interface
에 입력하는 것이 좋습니다. 내가 아는 한 그렇게하는 것은 좋은 습관이 아닙니다. 그러나, 나는 왜해서는 안되는 지 이해하지 못한다. 아니면 다른 해결책이 있습니까? 데이터 멤버를 인터페이스에 두어도 괜찮습니까?
답변
나는 그다지 문제가 없다고 말할 것이다. 차이점은 순수 인터페이스 클래스 대신 추상 기본 클래스이 있다는 점입니다. 그러나 인터페이스을 특정 멤버 변수에 묶이지 않은 구현에 사용하려면 항상 인터페이스 클래스과 추상 기본 클래스을 만들 수 있습니다. 너무 지나치게 지나치게 복잡해지기는하지만 나중에 인터페이스을 추상 자료에서 분할 할 수 있습니다.
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 {}
};
실제로는 "좋은 사례입니까?"라는 질문이 아닙니다. 인터페이스를 작성하면 표준을 정의하게됩니다. 문제는 그러한 데이터 멤버를 포함 할 인터페이스의 구현이 필요합니까? 당신은 당신의 구현을 이해하는 가장 좋은 위치에 있으므로, 당신은 정말로 이것을 대답 할 수있는 유일한 사람입니다.
일반적으로 인터페이스를 구현하는 클래스는 블랙 박스 여야하며 외부 세계는 멤버 데이터를 포함하여 내부에 액세스해서는 안됩니다. 인터페이스는 인터페이스를 지원할 수 있어야하는 공통 기능을 정의하며, 이러한 구현 세부 사항이 일반적으로 클래스의 기본 구현에만 포함될 것으로 기대합니다. YMMV.
클래스의 설계 원칙은 다음과 같아야합니다 생성자 (들) 클래스를 불변 설정하면
'그것은 불가능 외부에서 불변 클래스를 휴식', 그리고 모든 회원
클래스 불변성을 유지하면됩니다.
그러나 클래스에 클래스 불변성이 없으면
명의 공용 멤버가 같은 것을 성취합니다.
// 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. 얼마나 많은 데이터가 dom에 데이터 속성을 두어도 괜찮습니까?
- 2. javamail 세션 전송을 열어 두어도 괜찮습니까?
- 3. Views/MyController 디렉토리에 레이아웃을 두어도 괜찮습니까?
- 4. OnModelCreating 메서드에서 시드 데이터를 EF 코드 우선으로 두어도 괜찮습니까?
- 5. Linux 커널 : 스트리밍 DMA 매핑을 무기한 열어 두어도 괜찮습니까?
- 6. for 루프의 변수 이름을 "i"로 그대로 두어도 괜찮습니까?
- 7. 데코레이터 패턴에서 컬렉션 멤버를 조작해도 괜찮습니까?
- 8. 인터페이스에 의해 숨겨진 데이터 복사
- 9. Android의 사용자 인터페이스에 데이터 표시
- 10. js에 대한 데이터 배열 - 괜찮습니까?
- 11. MySQL과 직렬화 된 데이터, 괜찮습니까?
- 12. 내 앱 실행 시간 동안 임베디드 데이터베이스 파일을 열어 두어도 괜찮습니까?
- 13. Google 웹 로그 분석 태그를</body>과</html> 사이에 두어도 괜찮습니까?
- 14. Tomcat에서 JAX-WS 런타임이 필요합니다. "jax-ws/lib/*"를 "tomcat/lib"에 두어도 괜찮습니까?
- 15. jQuery 모바일 웹 사이트 jQuery 및 jQuery Mobile 라이브러리를 맨 아래에 두어도 괜찮습니까?
- 16. WCF 서비스의 데이터 멤버를 반복합니다.
- 17. WCF 서비스에 데이터 멤버를 나열하십시오.
- 18. 사례 클래스 데이터 멤버를 반복합니다.
- 19. 괜찮습니까?
- 20. 괜찮습니까?
- 21. DataTemplate 데이터 유형을 인터페이스에 바인딩하는 방법은 무엇입니까?
- 22. 코어 데이터 상속 :이 작업을 수행해도 괜찮습니까?
- 23. 데이터 전용 객체는 OOP 디자인에서 괜찮습니까?
- 24. 큰 번호를 넣어도 괜찮습니까? drawable의 이미지 수
- 25. Java에서 전역 변수를 어디에 두어도 상관 없습니까?
- 26. 데이터 세트를 마침내 차단 한 다음 데이터 세트를 반환해도 괜찮습니까?
- 27. std :: auto_ptr 데이터 멤버를 사용하여 UB를 호출합니까?
- 28. 클래스와 같은 데이터 구조의 멤버를 공개 하시겠습니까?
- 29. 데이터 템플릿 내에 ListBoxItem의 태그 멤버를 설정합니까?
- 30. 클래스 멤버를 RapidXML 데이터 형식으로 저장
C++가 뚜렷한 "인터페이스"단지 추상 클래스가 없습니다를 참조하십시오. 예를 들어 인터페이스에서. Java는 변수를 가질 수 없습니다. – deviantfan
공개 필드로 추상 기본 클래스 (C++의 인터페이스 없음)에 저장하는 경우 필드를 최신 상태로 유지하기 위해 파생 클래스의 구현 자에게 암시적인 부담을가합니다. 기본 클래스에 가상 (순수) 게터로 넣으면 구현자가 해당 클래스에 대해 생각하게 만듭니다. –