首先,我是有点警惕,夫妻接口的实现和宁愿子类和工厂设计从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