我正在从 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++ 中是否有等效的方法来执行此操作?
最佳答案
首先,我有点担心将接口(interface)与实现耦合的设计,并且更愿意将子类和工厂与 BankAccount
接口(interface)分开,但我们假设您想要它方式。
小心 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
。
关于c# - C++ 等效于 C# 嵌套私有(private)类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26289608/