C ++等价的C#嵌套私有类

时间:2014-10-09 23:29:59

标签: 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 ++中有相同的方法吗?

2 个答案:

答案 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();
}

Live demo

工厂方法必须返回指针,最好是像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()
{
    ...
}