2

たとえば、CreateNewDocument と OpenDocument という 2 つのメソッドがあり、これらは GUI コードの 2 つの異なるレベルにあります。1 つは低レベルで、メソッド名が意味することだけを行います。もう 1 つは高レベルで、必要な作業を行う前に、既存のドキュメントの保存解除の可能性をチェックします。低レベルの名前は、高レベルのメソッドを実装するために呼び出されるため、高レベルのコードに表示されます。私の質問は、ユーザーと読者を難読化しないためにそれらを区別する方法ですか? 以下に、図示されたコードを修正してください。

class GuiClass
{
public:
    // Re-implement to tell me how to do the low-level create new document.
    virtual void LowLevelCreateNewDocument(); 

    // Then I do the high-level version for you.
    void HighLevelCreateNewDocument()
    {
        // Handle unsavings and blabla...
        ...
        // Then do the low-level version
        LowLevelCreateNewDocument();
        // Afterward operations
        ...
    }
};
4

1 に答える 1

1

その「下位レベル」のCreateNewDocument()メソッドprotectedまたはprivateを、そのクラスまたは派生したクラス内の他のクラスメンバーからのみ呼び出す必要があるように思われるので、作成します。

class GuiClass
{
public:
    // Then I do the high-level version for you.
    void CreateNewDocument()
    {
        // Handle unsavings and blabla...
        ...
        // Then do the low-level version
        CreateNewDocumentInternal();
    }

protected:
    //pure virtual to enforce implementation within derived classes.
    //                                        |
    //                                        V
    virtual void CreateNewDocumentInternal() = 0; 
};

class GuiClassImpl : public GuiClass
{
protected:
    /*virtual*/ void CreateNewDocumentInternal()
    {
        //Do the low-level stuff here
    }
};

これらのメソッドが実際に異なる実装レベルにある場合は、既に提案されているように、それらを異なるクラスまたは名前空間に配置することを検討してください。純粋な仮想の保護されたメンバー関数を実装する必要があるサブクラスでは、適切なカプセル化が既に行われています。

于 2013-03-16T12:17:50.387 に答える