c# - C++ 等效于 C# 嵌套私有(private)类

标签 c# c++

我正在从 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();
}

Live demo

工厂方法必须返回一个指针,最好是像 unique_ptr 这样的智能指针。如果需要,unique_ptr 可以转换为 shared_ptr

关于c# - C++ 等效于 C# 嵌套私有(private)类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26289608/

相关文章:

c# - 性能计数器 NextValue() 非常慢(1,000 多个计数器)

c++ - 不理解示例中的行为 - strcpy() 和函数返回本地数组的地址

c++ - 在 Windows 10 中使用 vcpkg 安装 Tesseract

c# - 在大型项目中使用命名空间是否有任何指导方针?

c# - HtmlAgilityPack 并选择节点和子节点

c# - 当涉及到 MessageBox 时,String.Format() 的对齐方式表现不同

c++ - 尝试访问文件以存储数据时,为什么C++ cmd屏幕挂起?

c# - 使用线程 C# 时 UI 挂起

c++ - 带有子目录的 CMake

c++ - 从函数返回 istream 的正确方法