2016-11-22 2 views
1

C++ 클래스에 다중 인터페이스를 제공하는 문제에 대한 우아한 해결책을 제시하려고합니다. 클래스 B, C 및 D가 있다고 가정합니다. B와 C는 클래스 A에 대한 사용자 정의/제어 액세스가 필요하지만 D는 직접 액세스 할 수 있어야합니다. 이러한 인터페이스를 제공하는 솔루션은 확장 가능해야합니다. 미래의 인터페이스는 하나의 특정 클래스에 대해서만 전문화 될 수 있습니다.하나의 클래스에 대한 다중 인터페이스

현재 클래스 A에 대한 참조가있는 인터페이스 클래스 (IA_1, IA_2)를 만들고 있습니다. B와 C는 해당 인터페이스의 인스턴스로 제공되며 A부터 IA_1까지 각각 IA_2에 사용자 정의/제어 방식으로 액세스 할 수 있습니다. 상황은 아래 이미지에 묘사되어 있습니다.

enter image description here

새로운 인터페이스를 구현할 때 내가 클래스 A를 터치하지 않아도 장점이있다. 새 인터페이스는 상속을 통해 이전 인터페이스를 사용할 수 있습니다. A에 액세스해야하는 클래스는 특정 인터페이스를 통해서만 수행 할 수 있습니다.

C++에서의 구현은 다음과 같이 보일 것이다 : 만 수명 관리에 참여할에 액세스하는 클래스를 원하지 않기 때문에

class A{ 
public: 
    void foo(); 
}; 

class IA_1{ 
public: 
    void foo(const B& b); 
private: 
    std::weak_ptr<A> m_A; 
}; 

class IA_2{ 
public: 
    void foo(); 
private: 
    std::weak_ptr<A> m_A; 
}; 

class B{ 
    std::unique_ptr<IA_1> m_A; 
}; 

class C{ 
    std::unique_ptr<IA_1> m_A; 
}; 

class D{ 
    std::weak_ptr<A> m_A; 
}; 

인터페이스는에 weak_ptr를 얻을.

현재 B 또는 C의 모든 인스턴스에 대해 인터페이스 개체를 만들고 있는데, 모두 동일한 작업을 수행하고 있습니다. 나는 이미 단 하나의 인터페이스 객체를 생성하고 B와 C의 모든 인스턴스에 해당 인터페이스의 참조 (shared_ptr)를 제공 할 것을 고려했다. 그렇게하면 모든 인터페이스에 대해 하나의 객체 만 갖게됩니다. 어쩌면 이것은 이미 응용 프로그램의 메모리 사용량을 줄이기위한 조기 최적화의 경우 일 수 있습니다.

이 디자인을 개선하거나 전혀 다른 접근 방식을 사용할 수 있습니까?

+1

연결선이 바뀌어 UML이 혼란 스럽습니다 ([wikipedia 참조] (https : //en.wikipedia.org/wiki/Object_composition # UML_notation)) – stefaanv

+0

대신 조기 비참하게 보입니다. 객체에 대한 약한 포인터를 N 개 갖는 것은 객체에 대한 약한 포인터에 대한 N 개의 공유 포인터를 가지는 것보다 낫습니다. – user2079303

+0

@stefaanv 맞습니다. UML 다이어그램을 수정했습니다. – Stan

답변

2

아마 완전한 대답이 아니라 단지 내 생각입니다.

단점 :

  • 추가 인터페이스 클래스는 지원 호출 당 별도의 유지 보수,
  • 건설을
  • 추가 간접 소개 :
  • 약한 포인터 객체를 가리키는 인터페이스에 필요한 추가 공장 : 사건을 해결 포인터가 매달려 오는 곳

장점 :

    클래스에 인터페이스를 통해
  • 명확 제어
  • 수명 기간 동안
  • 추가 안전 (확인하실 수 있습니다뿐만 아니라 처리해야합니다)
  • 제한 변경 목적에 필요 (친구?)

소개 인터페이스 당 1 인스턴스 : 점유 공간은 조금 더 낮지 만, 그 1 인스턴스에 액세스하는 것 이상의 추가 관리가 필요합니다.

관련 문제