[英]container class member interaction
我想獲得一些有關如何改善整體程序設計的建議。
我有一個主要的班級,有兩個經常需要互相交流的成員。 這個類似於容器的類具有一個Initialize()
函數,該函數初始化兩個成員,而其他函數則提供對外界的訪問:
class Foo {
public:
bool InitializeAandB();
void UseFoo();
private:
TypeA a;
TypeB b;
};
在調用UseFoo()
之后的某個時刻, a
將需要調用b
的公共函數之一。 因此,假設TypeA具有這樣的成員函數:
void TypeA::Function() {
if (true) {
TypeB *bpointer;
bpointer->Interact(); // Need pointer to b here.
}
}
TypeA
和TypeB
是單獨的實體,不能合並為一個類。 碰巧的是,這些分離的實體需要在不同的時間相互交互。
我不想公開a
和b
因為它們不應在外界看到。 在Foo
中將TypeA
和TypeB
添加為朋友似乎是一個錯誤修復。 這也不是理想的,因為當TypeA
和TypeB
只需要彼此了解時,他們都需要了解Foo
。 公共GetA()
和GetB()
訪問器函數也是如此。
第三種選擇是將TypeB*
成員添加到TypeA
,將TypeA*
成員添加到TypeB
,這是在InitializeAandB()
期間設置的。 但這在某種程度上似乎是多余的,例如我缺少更好的總體設計。
有沒有更好的方法來設計這個?
如何將TypeB *
作為參數傳遞給TypeA::Function()
(反之亦然)?
依賴注入是我能想到的唯一選擇。
我同意@CreativeMind。 您應該在這里使用DI容器。
將初始化階段重構為單獨的類,並用A
和B
實例填充您的DI容器。 從實現中提取接口,並將其作為合同放置在某處。 現在它們是服務,可以互相詢問容器。
Foo
現在可以通過容器使用相同的方式使用A
和B
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.