C#基礎鞏固——成員變量修飾符protected 、internal與protected internal

1.類定義

(1)基類

    class Assembly1_MyClass1

    {

        internal int mem_internal_A;     //內部成員

        protected int mem_protected_A;        //保護成員

        protected internal int mem_protected_internal_A;     //受保護的內部成員

}

(2)同程序集派生類

    class Assembly1_MyClass2 :Assembly1_MyClass1        //同程序集繼承

{

}

(3)非同程序集派生類

在程序集2中定義Assembly2_MyClass1繼承自程序集1中的Assembly1_MyClass1

class Assembly2_MyClass1 :Assembly1_MyClass1

{

}

 

2.變量修飾符測試(同程序集)

(1)protected類型

測試1:派生類類內訪問

    class Assembly1_MyClass2 :Assembly1_MyClass1        //同程序集繼承

    {

        Assembly1_MyClass2 A1C2 =new Assembly1_MyClass2();   //派生類實例化

        Assembly1_MyClass1 A1C1 =new Assembly1_MyClass1();     //基類實例化

        void Test()

        {

            A1C2.mem_protected_A=1;       //可以訪問

            A1C1.mem_protected_A = 1;     //不可訪問

}

}


測試2:基類、派生類類外訪問

         Assembly1_MyClass1 A1C1 =new Assembly1_MyClass1();//基類實例化                        

         Assembly1_MyClass2 A1C2 = new Assembly1_MyClass2();   //派生類實例化

         A1C1.mem_protected_A1=1;    //基類外protected修飾的變量不可訪問

         A1C2.mem_protected_A=1;    //派生類外protected修飾的變量不可訪問

 

總結:只有通過派生類類型進行訪問時,基類的受保護成員在派生類中才是可訪問的。

 

(2)interal類型

測試1:派生類類內訪問

    class Assembly1_MyClass2 :Assembly1_MyClass1        //同程序集繼承

{

        Assembly1_MyClass1 A1C1 =new Assembly1_MyClass1();     //基類實例化

        Assembly1_MyClass2 A1C2 =new Assembly1_MyClass2();   //派生類實例化

        void Test()

        {

            A1C1.mem_internal_A = 1;        //可以訪問

            A1C2.mem_internal_A = 1;        //可以訪問

}

}

 

測試2:基類、派生類類外訪問

         Assembly1_MyClass1 A1C1 =new Assembly1_MyClass1();//基類實例化                 Assembly1_MyClass2 A1C2 = new Assembly1_MyClass2();   //派生類實例化

         A1C1.mem_internal_A=1;      //internal修飾的成員變量可訪問

         A1C2.mem_internal_A = 1;        //internal修飾的成員變量可訪問

總結:在同程序集下,internal類型修飾的成員變量可以在派生類或基類的類內、類外訪問。

 

(3)protected interal類型

測試1:派生類類內訪問

    class Assembly1_MyClass2 :Assembly1_MyClass1        //同程序集繼承

    {

        Assembly1_MyClass1 A1C1 =new Assembly1_MyClass1();     //基類實例化

        Assembly1_MyClass2 A1C2 =new Assembly1_MyClass2();   //派生類實例化

        void Test()

        {

              A1C1.mem_protected_internal_A=1;        //可以訪問

     A1C2.mem_protected_internal_A = 1;        //可以訪問

}

 }

 

測試2:基類、派生類類外訪問

        Assembly1_MyClass1 A1C1 =new Assembly1_MyClass1();//基類實例化                       

        Assembly1_MyClass2 A1C2 = new Assembly1_MyClass2();   //派生類實例化

        A1C1.mem_protected_internal_A = 1;  //protect internal 修飾的成員變量可訪問

        A1C2.mem_protected_internal_A = 1;  //protect internal 修飾的成員變量可訪問

總結:在同程序集下,protected internal類型修飾的成員變量可以在基類或派生類的類內、類外訪問(同程序集下protected internal和internal訪問性質相同,此處保留了internal的性質)。

 

3.變量修飾符測試(非同程序集)

測試1:派生類類內訪問  

        Assembly1_MyClass1 A1C1 =new Assembly1_MyClass1();     //基類變量實例化

        Assembly2_MyClass1 A2C1 =new Assembly2_MyClass1();     //派生類變量實例化

        void Test()

        {

            A1C1.mem_protected_internal_A = 1;      //protected internal修飾通過基類變量不可訪問

            A2C1.mem_protected_internal_A = 1;    //protected internal修飾通過派生類變量可以訪問(體現protected性質)

            A1C1.mem_protected_A = 1;   //protected修飾通過基類變量不可訪問

            A2C1.mem_protected_A = 1;   //protected修飾通過派生類變量可以訪問

   }

 

測試2:基類、派生類類外訪問

            Assembly1_MyClass1 A1C1 =new Assembly1_MyClass1();     //基類實例化

            Assembly2_MyClass1 A2C1 =new Assembly2_MyClass1();     //派生類實例化

            void Test()

            {

         //protected internal修飾通過基類變量不可訪問

                A1C1.mem_protected_internal_A = 1;    

                //protected internal修飾通過派生類變量不可以訪問(體現protected性質)  

                A2C1.mem_protected_internal_A = 1;                           A1C1.mem_protected_A = 1;   //protected修飾通過基類變量不可訪問

                A2C1.mem_protected_A = 1;   //protected修飾通過派生類變量可以訪問

            }

 

總結:在非同程序集下,protected internal類型修飾的成員變量可以在派生類的類內通過派生類變量進行訪問(與同程序集下的protected修飾的相同,此處保留了protected的性質)。

 

4.總結

在同程序集下,protected internal與internale相同,體現的是internal的性質,即在派生類類內、類外均可訪問繼承的基類使用protected internal修飾的成員變量。

在非同程序集下,protected internal與protected相同,體現的是protected的性質,即在只有在派生類的類內通過派生類實例的成員變量才能訪問繼承的基類使用protected修飾的成員變量。

 

 

 

 

 

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章