首先,我是有點警惕,夫妻接口的實現和寧願子類和工廠設計從BankAccount
分離接口,但讓我們假設你想這樣。
在使用C++ 11之前,要小心C++中的嵌套類,它們對外部類沒有特殊的訪問權限,但是您可以通過朋友類實現類似的功能。
使用C++ 11,我們得到了final
說明符,它允許我們防止子類化。
這裏是版本使用嵌套類,使用友元類來代替將是非常相似:
#include <memory>
class BankAccount {
private:
class SavingsAccount;
class ChequingAccount;
BankAccount() = default; // prevent third-party subclassing
public:
virtual ~BankAccount() {}
static std::unique_ptr<BankAccount> makeSavingsAccount();
static std::unique_ptr<BankAccount> makeChequingAccount();
};
class BankAccount::SavingsAccount final : public BankAccount { };
class BankAccount::ChequingAccount final : public BankAccount { };
std::unique_ptr<BankAccount>
BankAccount::makeSavingsAccount() {
return std::make_unique<SavingsAccount>();
}
std::unique_ptr<BankAccount>
BankAccount::makeChequingAccount() {
return std::make_unique<ChequingAccount>();
}
int main() {
auto savings = BankAccount::makeSavingsAccount();
auto chequing = BankAccount::makeChequingAccount();
}
Live demo
工廠方法必須返回一個指針,最好是智能指針像unique_ptr
。如果需要,unique_ptr
可以轉換爲shared_ptr
。
關鍵字'final'可能會幫助你(C++ 11) – OMGtechy 2014-10-09 23:33:20
你永遠不會完全對齊兩種不同語言的語義。此外,在目標語言中這樣做也許沒有意義。我建議你不要試圖通過C#眼鏡來查看C++。忘記你對C#的瞭解,並從頭開始學習C++。 – Galik 2014-10-09 23:39:51
堅持使用c#並使用不安全的關鍵字。如果你不知道你在用c/C++做什麼,你可以真正打開自己的安全漏洞。 – RadioSpace 2014-10-09 23:42:03