X : 서로 관련이없는 서로 다른 유형의 객체를 처리하는 비 관련 컨테이너 형 객체 (벡터,지도, 트리 등)의 모음이 있습니다. 이 A 테이너에있는 오브젝트의 수명은 그 중 일부 서브 세트간에 공유됩니다. 나는 그들의 동기화를 담당하는 대상을 가지고있다. 내가 생각할 수있는 동기화 클래스의 가장 간단한 구현은 BaseContainerLike
포인터의 벡터를 갖는 것입니다. BaseContainerLike
은 내가 관리하고자하는 모든 컨테이너와 같은 객체에 대한 공통 인터페이스를 구현하는 클래스입니다. 그러나 그들 모두가 용기 같은 것은 아닙니다. 그들은 같이 컨테이너로 사용할 수 있지만 공통 기본 클래스에서 상속받는 것은 매우 이상하게 느껴지고 그것이 내 디자인을 매우 강하게 두려워합니다.상속없는 다형성
그래서 나는이 같은 ContainerLikeInterface
클래스를 만들었습니다
struct ContainerLikeInterface {
template<T>
ContainerLikeInterface(T& t)
: create([](int i){ return t->create(i); }), // this is just an example
delete([](int i){ return t->delete(i); }) {}
std::function<void(int)> create;
std::function<void(int)> delete;
};
template<class T>
ContainerLikeInterface make_containerLikeInterface(T& t) {
return ContainerLikeInterface(t);
}
이 나를 하찮게 (난 그냥 부분적으로 다른 유형의 생성자를 전문 수) 비 관입 방법으로 인터페이스의 벡터를 만들 수 있습니다 . 이 접근 방식을 사용하는 코드는 상속을 사용할 때보 다 약간 빠르지 만 약간 더 많은 메모리와 컴파일 시간이 필요합니다 (그러나 컴파일 시간의 우선 순위는 지정하지 않습니다). 그러나이 방법이 내 프로젝트와 잘 맞는지 잘 모르겠습니다. 그리고 나는 사람들이 인터페이스에 객체의 소유권을 이전하는 것을 선호하는 가치를 의미에 대한 몇 가지 기사를 읽었습니다, 그래서 나는 다음과 같은 질문이 :
- 어떤이 방법의 장점/단점입니까?
- 장기적으로 어떤 문제가 생길 수 있습니까?
- 대신 상속을 사용해야합니까?
- 다른 방식으로 구현해야합니까?
- 대신 라이브러리를 사용해야합니까? (boost::TypeErasure, adobe::poly, 또는 pyrtsa/poly)
좋은지 여부는 전적으로 해결하려는 문제에 달려 있습니다.이 문제는 생략했습니다. 즉, 왜이 상황에 처해 있니? – GManNickG
@GManNickG이 상황에서 어떻게 끝났는지 설명하는 구체적인 문제에 대한 추가 정보를 추가했습니다. – gnzlbg