2014-10-09 82 views
2

我正在學習來自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++中有這樣的方法嗎?

+0

關鍵字'final'可能會幫助你(C++ 11) – OMGtechy 2014-10-09 23:33:20

+3

你永遠不會完全對齊兩種不同語言的語義。此外,在目標語言中這樣做也許沒有意義。我建議你不要試圖通過C#眼鏡來查看C++。忘記你對C#的瞭解,並從頭開始學習C++。 – Galik 2014-10-09 23:39:51

+0

堅持使用c#並使用不安全的關鍵字。如果你不知道你在用c/C++做什麼,你可以真正打開自己的安全漏洞。 – RadioSpace 2014-10-09 23:42:03

回答

1

首先,我是有點警惕,夫妻接口的實現和寧願子類和工廠設計從BankAccount分離接口,但讓我們假設你想這樣。

在使用C++ 11之前,要小心C++中的嵌套類,它們對外部類沒有特殊的訪問權限,但是您可以通過朋友類實現類似的功能。

使用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

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() 
{ 
    ... 
} 
+0

工廠方法如何實施? – cm007 2014-10-09 23:58:13

+0

與C#幾乎完全相同。在'BankAccount'類中。 – 2014-10-10 00:01:03

+0

@ChrisDrew:私有構造函數在C++中是微不足道的 - 我只是複製了可能不明顯的C++代碼。 – 2014-10-10 01:04:39