簡體   English   中英

面向對象的設計幫助從C ++到C#

[英]Object Oriented Design help from C++ to C#

嘿我經常遇到一種情況,我將創建一個只能由一個或幾個類實例化的類。 在這種情況下,我會將其構造函數設為私有,並使其成為應該能夠實例化它的對象的友元類。 例如(在C ++中):

class CFoo
{
    friend class CFoo;

    // private ctor because only a select few classes should instantiate
    private:
    CFoo()
    {
        ... Do stuff
    }
}

class CBar
{
    // CBar is one of the few classes that only need to use CFoo

    CFoo *m_pFoo;

    CBar()
    {
        m_pFoo = new CFoo;
    }
}

所以我的問題是:這是愚蠢的嗎? 或者有更好的方法來實現這一目標嗎? 考慮到語言完全缺少friend關鍵字,我對C#的工作方式特別感興趣。 謝謝。

這里的目標似乎是,在你擁有一個可行的CBar之前,你不能擁有CFoo。

您可以通過為CFoo創建一個私有構造函數,然后在CFoo中創建一個靜態方法來獲取相同的內容,該方法接受一個CBar參數並調用所述構造函數並返回新的CFoo。

這將類似於System.Drawing.Graphics.FromImage(Image image)方法。

有關為什么C#沒有friend關鍵字的問題已在其他地方介紹過

在C#中,取決於類的使用方式,您可以在另一個類的范圍內定義一個類。

public class CBar
{
    CBar()
    {
        m_pFoo = new CFoo();
    }

    CFoo m_pFoo;

    private class CFoo
    {
        CFoo()
        {
            // Do stuff
        }
    }
}

你可以看看CFoo內部標記

internal class CFoo
  • 這可能適合您的需求。 正如@g所說,你可以在類中嵌套類,但這有點代碼味道恕我直言。

僅僅因為只有少數特定的類使用CFoo,並不意味着你應該明確阻止其他類使用它。 如果這確實是需要,您可能需要重新考慮您的設計。 你肯定不想在代碼中強制使用這么多的耦合。 關注為什么要這樣做的一些細節,所以我們可以更好地建議一個好的解決方案?

為了幫助思考它是否是愚蠢的,你能提供更具體的例子嗎?

我會說在沒有充分理由的情況下使用朋友對我來說聽起來有點奇怪......在C#中你有匯編這樣的東西,所以你可以使用內部構造函數或私有構造函數和幾個不同訪問的靜態創建方法(受保護,公共,內部...)

首先,朋友聲明是在錯誤的班級。 CFoo需要朋友CBar才能讓CBar訪問它的私人成員。

其次,是的,一般應該避免這種情況。 類應該很少關心它們的使用方式和位置。 如果他們這樣做,那么該功能可能應該以不同方式分解。

只需將課程設為私有。 這只是將范圍限制為你的dll(exe等)。 沒有什么比C#中的朋友聲明那么酷,但Marcin是正確的,你應該重新考慮這樣的設計。 如果你真的需要'朋友'支持,你可以使用反射在運行時模擬它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM