首先,我認爲我想要的術語既不是「延遲加載」也不是「動態綁定」。我不知道正確的術語,但是當我這樣做時我會編輯這個問題。延遲加載/動態綁定vs安全
我連接處理對象來創建數據流A-> B:
方法1:實例化過程中連接 代碼:https://ideone.com/Rsqabi
class Consumer {
public:
virtual void consume(int data) = 0;
};
class A {
public:
A(Consumer& consumer) : consumer_(consumer) {}
void process(int data) { consumer_.consume(data); }
private:
Consumer& consumer_;
};
class B : public Consumer {
public:
B() {}
void consume(int data) { /* consume data */ }
};
我必須有一個消費者實例方便實例化 - 答:
int main() {
B* b_ = new B();
A a_ = A(*b_);
a_.process(5);
return 0;
}
方法2:連接後實例化 代碼:https://ideone.com/5ij0yZ
我真正想要的是選擇我的消費類實例化後:
class A {
public:
A() {}
void attachConsumer(Consumer* consumer) { consumer_ = consumer; }
void process(int data) {
// must always check consumer_ here!
consumer_->consume(data);
}
private:
Consumer* consumer_;
};
然後:
int main() {
A a_ = A();
// ... for reasons I won't tell you, B must be created later than A ...
B* b_ = new B();
a_.attachConsumer(b_);
a_.process(5);
return 0;
}
更好的模式?
方法1是偉大的,因爲我總是知道參考是有效的。這是不靈活的,這很糟糕。
方法2很好,因爲我可以選擇消費者附加的道路(或者如果安全地考慮狀態,則重新附加)。這很糟糕,因爲指針是危險的。
是否有方法3滿足兩個模型的正數?在哪裏我不總是需要檢查我的消費者是否有效並附加,但是這也允許動態連接?
這些模型的區別是什麼?我不認爲這是懶加載或動態綁定。請指教。