簡體   English   中英

從C#的派生類不能訪問保護字段

[英]protected field is not accesible from derived class in C#

我試圖從派生類訪問受保護的字符串,但無法訪問

public class ParentClass
    {
        public string UserName {
            get { return "User Name is accessible to any class under same namespace Skin_File"; }
            set { }
        }
        private string AccountNumber {
            get { return "Not accessible from child class"; }
            set { }
        }
        internal string UserAge {
            get { return "User Age is accesible to child class"; }
            set { }
        }
        protected string PhoneNumber {
            get { return "Accessible only to ParentClass"; }
            set { }
        }
    }
    protected class DerivedClass : ParentClass
    {
        string DerivedUserName = new ParentClass().UserName;
        string  DerivedAccountNumber = new ParentClass().AccountNumber; // Not accessible since that was private
        string DerivedUserAge = new ParentClass().UserAge;
        protected  string DerivedPhoneNumber = new ParentClass().PhoneNumber; // derived class but not accessible
    }

這是需要它的人的小提琴

這個:

string DerivedPhoneNumber = new ParentClass().PhoneNumber;

從創建一個ParentClass的實例,並且只能訪問公共成員。 繼承 ParentClass ,您也繼承了它的受保護成員。

如果要初始化值,則需要在類構造函數中進行初始化:

protected DerivedClass()
{
    DerivedPhoneNumber = PhoneNumber;
}

雖然,我看不到聲明另一個字段來存儲相同數字的意義。 直接訪問它。

您創建ParentClass的實例。 您看不到受保護的成員。 您可以從DerivedClass訪問其受保護的成員。 你只需要調用

protected  string DerivedPhoneNumber = PhoneNumber;

嘗試以下

internal class DerivedClass : ParentClass
{
    string DerivedUserName = new ParentClass().UserName;
    string DerivedUserAge = new ParentClass().UserAge;
    protected string DerivedPhoneNumber;// = PhoneNumber; // derived class but not accessible

    public DerivedClass() {
        DerivedPhoneNumber = PhoneNumber;
    }
}

您不應該為所謂的訪問創建新類,它會完全破壞繼承。

私有字段只能在聲明類中訪問。 可以通過聲明類+所有派生類+擴展方法來訪問受保護的字段內部字段可以通過聲明類+所有派生類+相同名稱空間/程序集中的擴展方法來訪問(我認為)

此外,在考慮基類/派生類時,也要考慮修飾符,希望允許基類修改的屬性/方法應標記為虛擬,不應進一步擴展的屬性/方法不應被獲取。修飾符。

因此,基類:

public class ParentClass
{
    private string userName;
    public virtual string UserName
    {
        get
        {
            return username;
        }
        set
        {
            username = value;
        }
    }

    private string accountNumber; // don't see a reason why it should be a property rather than a field...

    private int userAge;
    internal int UserAge
    {
        get
        {
            return userAge;
        }
        set
        {
            userAge = value;
        }
    }

    protected string phoneNumber;
    public virtual string PhoneNumber
    {
        get
        {
            return phoneNumber;
        }
        set
        {
            phoneNumber = value;
        }
    }

    public ParentClass()
    {
        // potentially do something intresting
    }
}

現在使其變為多態

public class DerivedClass : ParentClass
{
    public string CountryCode
    {
        get; set;
    }
    // we can override phoneNumber
    public override string PhoneNumber
    {
        get
        {
            if (!string.IsNullOrWhiteSpace(base.PhoneNumber)) {
                 return base.PhoneNumber;
            }
            if (!base.PhoneNumber.StartsWith(CountryCode)) {
                return CountryCode + base.PhoneNumber;
            }
            return base.PhoneNumber;  // you could also return the field phoneNumber instead (as it is protected)
        }
        set
        {
            base.PhoneNumber = CountryCode + value; // you could also set the field phoneNumber ... (we are adding country code here)
        }
    }

    public DerivedClass() : this("0049")
    {
    }

    public DerivedClass(string countryCode) : base() // call the base constructor as well
    {
        // do something more than what the parentclass is doing, eg...
         this.CountryCode = countryCode;
    }
}

現在,在Derivedclass中,您可以選擇以不同的方式設置/返回電話號碼,這意味着所有看到ParentClass的類也可以與DerivedClass一起使用,並且具有相同的屬性,但是該屬性的實現將被更改派生類。

但是,對於我來說,您的示例確實還不夠清楚,無法知道您的請求是什么,您想做什么以及它應該如何表現。

暫無
暫無

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

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