天天看點

類與類成員(字段和方法)的通路權限

類與類成員(字段和方法)的通路權限
類與類成員(字段和方法)的通路權限
類與類成員(字段和方法)的通路權限

public class A

{

public int publicI; //public 和private 主要用于定義單個類的成員存取權限

private int privateI;

protected int protectedI;

private void f() //隻要是類A 直接定義的執行個體方法,不管它是公有還是私有的,都可以通路類自身的私有執行個體字段

  {

    privateI = 100; //OK! 類A 的私有執行個體字段privateI 隻能被自身的執行個體方法所使用

  }

}

A a = new A();

a.publicI = 100; //OK!當外界建立一個A 的對象後,隻能通路A 的公有執行個體字段publicI

class Parent

{

public int publicField=0;

private int privateFiled=0;

protected int protectedField=0;

protected void protectedFunc()

{ }

}

class Son:Parent

{

  public void ChildFunc()

  {

    publicField = 100; //正确!子類能通路父類的公有字段

    privateFiled = 200; //錯誤!子類不能通路父類的私有字段

    protectedField = 300; //正确!子類能通路父類的保護字段

    protectedFunc(); //正确!子類能通路父類的保護方法

  }

}

當建立子類對象後,外界可以通路子類的公有成員和父類公有成員。通過子類對象通路其父類的所有公有成員,事實上,外界根本分不清楚對象的哪些公有成員來自父類,哪些公有成員來自子類自身。

Son obj = new Son ();

obj.ChildFunc();  //可以調用子類的公有方法

obj.publicField=1000;//可以通路父類的公有字段

程式集(一個DLL 或EXE 檔案)中可以有多個類,如果某個類可被同一程式集中的類通路,但其他程式集中的類不能通路它,則稱此類具有internal 通路性。internal 有點像public,外界類也可以直接通路聲明為internal 的類或類的成員,但這隻局限于同一個程式集内部。

例如類庫項目ClassLibrary1 可以生成一個獨立的程式集(假定項目編譯後生成ClassLibrary1.DLL),其中定義了兩個類A 和B:

namespace ClassLibrary1

{

  internal class A

  {

    internal int InternalI=0;

  }

  public class B

  {

    public void f()

    {

      A a = new A(); //OK!

      a. InternalI= 100; //OK!

    }

  }

}

在程式集ClassLibrary1.DLL 之外,外界隻能建立聲明為public 的類B 的對象,不能建立聲明為internal 的類A 的對象。

internal 是C#的預設可通路性,這就是說,如果程式集中的某個類沒有任何可通路性關鍵字在它前面,則它就是internal 的。但要注意,在類中,如果省略成員的可通路性關鍵,則預設為private 的。

繼續閱讀