2016-11-22 78 views
1

我想爲C++中提供多個接口的問題提出一個優雅的解決方案。 假設我們有B,C和D類.B和C需要定製/控制對A類的訪問,而D可以直接訪問。提供這種接口的解決方案需要可擴展。未來的接口可能只針對一個特定的類。一個類的多個接口

當前我正在創建引用類A的接口類(IA_1,IA_2)。B和C將提供這些接口的實例,並且可以以定製/受控方式分別通過IA_1和IA_2訪問A.下圖描述了這種情況。

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以A,因爲我不想類它們僅訪問一個參與其生命週期管理。

目前我正在爲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個實例:佔用空間會稍微低一點,但您需要對訪問該實例的額外管理。

相關問題