返回
Featured image of post C♯ - 物件導向(Object-Oriented) - 封裝(Encapsulation) 筆記

C♯ - 物件導向(Object-Oriented) - 封裝(Encapsulation) 筆記

「封裝」表示隱藏型別取用者不必要的詳細資料。

官方的封裝可以列在 存取修飾詞 這篇。

存取修飾詞

存取修飾詞作用存取範圍
public公開無限制
private(預設)私有只有 本身可以存取
protected保護相同 父類別 or 繼承自父類別的子類別(衍生類別),可參考繼承使用方式
internal內部限於目前元件
protected internal存取限於目前元件或衍生自包含類別的類型
private protected存取限於包含類別或衍生自目前元件內包含類別的類型

Private

class Employee
{
    private int i;
    double d;   // 預設 Private
}

Example:

class Employee2
{
    private string name = "FirstName, LastName";
    private double salary = 100.0;

    public string GetName()
    {
        return name;
    }

    public double Salary
    {
        get { return salary; }
    }
}

class PrivateTest
{
    static void Main()
    {
        var e = new Employee2();

        // 數據成員不可訪問(私有)
        //    string n = e.name; // Error
        //    double s = e.salary; // Error

        string n = e.GetName(); // Success
        double s = e.Salary; // Success
    }
}

Public

class SampleClass
{
    public int x; // 沒有訪問限制
}

Example

class PointTest
{
    public int x;
    public int y;
}

class Program
{
    static void Main()
    {
        var p = new PointTest();
        // 直接訪問公共成員。
        p.x = 10;
        p.y = 15;
        Console.WriteLine($"x = {p.x}, y = {p.y}"); // Output: x = 10, y = 15
    }
}
// Output: x = 10, y = 15

Protected

class A
{
    protected int x = 123;
}

class B : A // 繼承 A
{
    static void Main()
    {
        var a = new A();
        var b = new B();

        a.x = 10; // Error CS1540, 因為x只能由A or A的繼承所使用,此操作是由 Main 所發出而不是在B的執行個體所以無法使用。
        b.x = 10; // Success, 因為繼承至A所以可以使用
    }
}

Internal

只能使用於相同的檔案內部使用,不同的檔案則無法使用。常用於以元件為基礎的開發作,因為它可讓一組元件私下相互合作,而不會公開給應用程式的其餘程式碼。

Example

// Assembly1.cs  
// Compile with: /target:library  
internal class BaseClass
{  
   public static int intM = 0;  
}
// Assembly1_a.cs  
// Compile with: /reference:Assembly1.dll  
class TestAccess
{  
   static void Main()
   {  
      var myBase = new BaseClass();   // CS0122  
   }  
}
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus