簡體   English   中英

c#工廠方法和保護級別問題

[英]c# Factory Method and protection levels problem

我有一個基類和從該基類派生的幾個子類。 我在基類中也有一個帶有一些參數的靜態函數,並根據輸入參數(我的工廠方法)實例化並返回一個合適的子類。

現在這是我的問題:我想只允許從工廠方法實例化子類。 但是,如果我將子類的構造函數設置為受保護,則基類無法看到它們。 是否有一個我缺少的訪問修飾符,它允許基類調用子類構造函數,但是不允許任何其他類調用它們?

內部看起來不會起作用...我想限制對子類構造函數的訪問只限於基類,同一個程序集中的其他類應該能夠訪問基本工廠方法但不能直接訪問實例化任何子類。

希望有一些非常簡單的東西,我想念......

例:

public class Base
{
    public Base CreateChild(string childType)
    {
        if(childType == "A")
            return new ChildA();
        if(childType == "B")
            return new ChildB();

        return null;
    }
}

public class ChildA
{
    protected ChildA() // This doesn't work, since now base class can't call this!
    {
    }
}

public class ChildB
{
    protected ChildB()
    {
    }
}

您是否嘗試在基類中聲明子類?

public class Base {
    protected class ChildA {}
    protected class ChildB {}
}

您可以將子類聲明為Base中的私有嵌套類

如果通過類型訪問任何派生對象是一個有效的場景(假設派生類型只覆蓋基本實現而不添加新功能)那么建議的派生類型嵌套private類的解決方案(如先前的答案所提出的)是最好的解。

如果情況並非如此,那么我認為你正陷入一種不合理的復雜情況。 同一程序ChildB代碼無法訪問ChildAChildB構造函數的原因是什么? 它是您可以控制的所有代碼之后,因此您始終可以選擇通過代碼審查來制定/執行他的初始化是通過工廠方法。

我理解有正當理由不讓外部程序集自由地實例化對象,除非通過嚴格控制的機制。 在這種情況下,只需將構造函數標記為internal構造函數即可。

否則,我不確定你是否可以實現你假裝的東西而不為這個類及其派生類創建一個特定的程序集。 肯定沒有訪問修飾符可以使派生類中的靜態方法只能從它的類中看到。

暫無
暫無

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

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