기본 클래스에서 파생 클래스 멤버를 사용해야하는 클래스를 디자인하는 방법은 무엇입니까?

까마귀

일반적으로 우리는 클래스를 디자인하기 위해 가상 함수 또는 합성을 사용합니다. 제가 아는 것처럼 가상 함수를 사용하면 클래스가 더 구조화됩니다. 사용 구성은 단순화하기 쉽지만 더 많은 중복 코드를 작성할 수 있습니다. 이 상황에서 : 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(잘못된!!!)

그렇다면 문제를 해결하기 위해 클래스를 디자인하는 방법은 무엇입니까? 이제 두 가지 아이디어가 있지만 만족할 수없는 것 같아요

  1. use static_cast<derived_class>(this)->derivedFunc(), 첫 번째이 작업은 우아하지 않고 두 Inheritance + encapsulation번째이 작업을 사용하면 여전히 의미가 있습니까?
  2. 같은 공통 기능 virtual std::map<std::string, void *> GetData() = 0을 사용 member field name하여 파일 데이터를 가져 오지만 파생 기능을 사용하는 방법이 여전히 문제입니까?

이 질문은 클래스 디자인 질문 일 수 있습니다. 질문에 대한 답변을 도와 주시겠습니까?

Sebastian Redl

두 파서가 동일한 데이터를 반환하지 않으면 관련 인터페이스가 없으며 공통 기본 클래스가 없어야합니다.

동일한 데이터를 반환하는 경우 GetData함수를 기본 클래스에 넣습니다 . 또는 더 나은 방법은 Parse.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관