일반적으로 우리는 클래스를 디자인하기 위해 가상 함수 또는 합성을 사용합니다. 제가 아는 것처럼 가상 함수를 사용하면 클래스가 더 구조화됩니다. 사용 구성은 단순화하기 쉽지만 더 많은 중복 코드를 작성할 수 있습니다. 이 상황에서 : I need a parser, it will use for different protocol. 이제 다음과 같이 AParser라는 A-Protocol, BParser라는 B-Protocol에서 사용한다고 가정합니다.
class Parser {
public:
Parser(...);
virtual ~Parser() = default;
virtual bool Parse(...) = 0;
private:
// some attributes may be common
};
class AParser() : public Parser {
public:
AParser(...) : Parser() {};
~AParser() override = default;
void bool Parser(...) override;
inline AData Data() const { return AData_;}
private:
AData_;
}
class BParser() : public Parser {
public:
BParser(...) : Parser() {};
~BParser() override = default;
void bool Parser(...) override;
inline BData Data() const { return BData_;}
private:
BData_;
}
잘, AData
그리고 BData
모두가 기본 클래스에 넣으면 안됩니다, 자신의 개인 데이터이며,
또한 virtual AData/BData Data() = 0
(잘못된!!!)
그렇다면 문제를 해결하기 위해 클래스를 디자인하는 방법은 무엇입니까? 이제 두 가지 아이디어가 있지만 만족할 수없는 것 같아요
static_cast<derived_class>(this)->derivedFunc()
, 첫 번째이 작업은 우아하지 않고 두 Inheritance + encapsulation
번째이 작업을 사용하면 여전히 의미가 있습니까?virtual std::map<std::string, void *> GetData() = 0
을 사용 member field name
하여 파일 데이터를 가져 오지만 파생 기능을 사용하는 방법이 여전히 문제입니까?이 질문은 클래스 디자인 질문 일 수 있습니다. 질문에 대한 답변을 도와 주시겠습니까?
두 파서가 동일한 데이터를 반환하지 않으면 관련 인터페이스가 없으며 공통 기본 클래스가 없어야합니다.
동일한 데이터를 반환하는 경우 GetData
함수를 기본 클래스에 넣습니다 . 또는 더 나은 방법은 Parse
.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다