[英]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.