https://www.cnblogs.com/wangyt223/archive/2012/08/08/2627801.html
在c#的可訪問性級別中,public和private算是最容易理解的,相反protected往往令人非常頭疼。經常在網上查資料的朋友往往會發現,
答案幾乎都是前篇一律,不是從msdn上拷貝的就是從別人的博客上抄襲的,簡直是天下文章一大抄,今天咱們就來點和別人不同的,通過例子來透析一下
protected訪問修飾符到底是怎么回事。
下面先來看一下,protected訪問修飾符在大多數資料中的定義:訪問僅限於包含類或從包含類派生的類型。搞明白問題只靠眼看是不行的,需要實踐,現
在我們用事實來說明問題。
代碼如下:
class BaseTest { public int a = 10; protected int b = 2;
}
class ChildTest:BaseTest { int c; int d; public void printTest() { BaseTest basetest = new BaseTest(); this.a=basetest.a; this.c = basetest.b;//這句有錯誤 } }
這段代碼中派生類中的方法的最后一行代碼會報錯:無法通過類型“protectedtest.Vehicle”的限定符訪問保護成員
“protectedtest.Vehicle.weight”;限定符必須是類型“protectedtest.Car”(或者從該類型派生)。看到這
里就會有很多人要問了,不是說protected類型的訪問僅限於包含類或者從包含類派生的類型嗎,為什么這里還是要報錯呢,下面就來說明一下,包含類能
夠使用protected類型的應該是沒有任何問題了,這里就不用說了,主要問題就是集中在為什么在上面的那個例子中基類的實例為什么不能夠訪問
protected類型的變量,這里就涉及到對protected類型的理解,protected類型並不是能夠被派生類所訪問就是隨心所欲的訪問,而是
有條件的,訪問必須是通過派生類類型發生時,在派生類中的基類的protected類型成員才能夠被訪問,這里就很清楚了上面的代碼並不是通過派生類的類
型訪問的,而是通過基類的類型訪問的,此時此刻,protected和private十分的相似,只不過,protected類型成員能夠被派生類所繼承
並且能夠通過派生類類型訪問罷了。
改成如下形式就正確了,不過大家不過拘泥於這兩個代碼的形式,要看透到底是說明了個什么問題.
class BaseTest { public int a = 10; protected int b = 2; } class ChildTest : BaseTest { int c; int d; static void Main(string[] args) { BaseTest basetest = new BaseTest(); ChildTest childTest = new ChildTest(); Console.WriteLine(childTest.b); } }