2012-11-12 31 views
0

我試圖只使用基類的特定部分,同時隱藏其他部分。考慮下面的代碼:,但沒有暴露IY接口如何限制對基類的一部分的訪問?

struct IX 
{ 
    // ... 
}; 

struct IY 
{ 
    // ... 
}; 

class Base : 
    public IX, 
    public IY 
{ 
    // Implements IX and IY. 
    // ... 
}; 


// Reuse IX implementation, but don't expose IY. 
// 
class X : protected Base 
{ 
public: 
    using Base::IX; // <-- Doesn't exist in C++. 
}; 

我可以享受Base提供的IX實施?

當然,我可以輸入using Base::IX::xxx所有方法,它存在於IX。另外,我所有的呼叫轉發到執行這樣的:

// 
class X : public IX 
{ 
public: 
    // Forward all calls to IX methods to m_p. 
    // ... 

protected: 
    Base* m_p; 
}; 

但同樣,我必須鍵入IX可用的方法,以轉發。每次更改IX時,我都必須更新X

謝謝。

亞歷

回答

0

嗯,基本上實現IXIYclass X受到保護。您可以將訪問者和修飾符公開爲類中的公共方法。

另一種方法是從基地公開揭露IX:

class Base : public IX, protected IY 
{ 
    // Implements IX and IY. 
    // ... 
    // Expose access to IY through base for the class 
    // inheriting from Base 
}; 

class X : public Base 

另一種可能性是不是從IXIY繼承,但他們繼續爲您Base的公共成員:

class Base 
{ 
public: 
    IX member1; 
    IY member2; 
}; 

這樣,您可以從Base繼承保護,並可以從class X中爲member1公開一個訪問器和修飾符方法。

+0

@ konstantin-d-infragistics'IX'和'Base'已經存在並在其他地方使用。另外,'IX'包含了很多東西,比如'typedef',嵌套類等等。因此,每次修改'IX'都可能是一項艱鉅的任務。 –

+0

@AlexBlekhman我做了和編輯,有兩個建議。第一個仍然假設如果你改變IY你將不得不改變基地。第二個不需要更改。 –

+0

感謝您的回答。但是,爲了使用第二個變體,我必須首先實現'IX'和'IY'。所以,'Base'將會有'IXImpl'和'IYImpl'這樣的成員。它使得其他用戶使用'Base'非常繁瑣。我傾向於認爲這個問題在C++中沒有乾淨的解決方案。所以,從'IX'繼承並在內部轉發所有的調用可能是解決它的最骯髒的方法。 –