我正在学习来自C#的C ++。在C#中,可以有以下类:
public abstract class BankAccount
{
private BankAccount() {} // prevent third-party subclassing.
private sealed class SavingsAccount : BankAccount { ... }
private sealed class ChequingAccount : BankAccount { ... }
public static BankAccount MakeSavingAccount() { ... }
public static BankAccount MakeChequingAccount() { ... }
}
这样,消费者不必担心BankAccount
的类型,也不能嵌套自己的子类。
在C ++中有相同的方法吗?
答案 0 :(得分:1)
首先,我有点担心将接口与实现耦合在一起的设计,并希望将子类和工厂与BankAccount
接口分开,但让我们假设您希望这样。< / p>
小心C ++中的嵌套类,在C ++ 11之前,他们对外部类没有特殊的访问权限,但你可以用朋友类实现类似的东西。
使用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();
}
工厂方法必须返回指针,最好是像unique_ptr
这样的智能指针。如果需要,unique_ptr
可以转换为shared_ptr
。
答案 1 :(得分:0)
这在C ++中是直截了当的:
class BankAccount
{
private:
BankAccount(){}
class SavingsAccount;
class ChequingAccount;
public:
static BankAccount MakeSavingAccount();
static BankAccount MakeChequingAccount();
};
class BankAccount::SavingsAccount final : public BankAccount
{
};
class BankAccount::ChequingAccount final : public BankAccount
{
};
BankAccount BankAccount::MakeSavingAccount()
{
...
}
BankAccount BankAccount::MakeChequingAccount()
{
...
}