Во-первых, я немного настороженно относятся к конструкции, которая соединяет интерфейс для реализации и предпочли бы иметь подклассы и заводы отдельно от BankAccount
интерфейс, но давайте предположим, что вы так хотите.
Будьте осторожны с вложенными классами на 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
, если требуется.
ключевое слово 'final' может вам помочь (C++ 11) – OMGtechy
Вы никогда не собираетесь полностью выровнять семантику двух разных языков. Также это может не иметь смысла на целевом языке для этого. Я рекомендую вам не пытаться просматривать C++ через очки C#. Забудьте о том, что вы знаете о C#, и изучите C++ с нуля. – Galik
придерживаться C# и использовать небезопасное ключевое слово. если вы не знаете, что делаете с помощью c/C++, вы действительно можете открыть себя до недостатков безопасности. – RadioSpace