iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 14
0
自我挑戰組

初心者學C#系列 第 14

Day 14:C#的封裝 /╲/( ͡° ͡° ͜ʖ ͡° ͡°)/\╱\

  • 分享至 

  • xImage
  •  

※以下內容皆是新手撰寫,內容可能不完全正確

不知道有沒有人看出標題裡面的是隻表情奇特的蜘蛛ヘ(= ̄∇ ̄)ノ
這過程中也讓自己在程式中看得懂的東西增加,之前不懂的,現在好像懂(?)吧

回到正經話題,今天的主題是 封裝(encapsulation) ,而封裝的定義是把「一個或多個物品裝在一個實體的或邏輯性質的包裝裡」(這不是我定義的)。C#程式語言中,封裝的意義是物件隱藏使用者不需要的資訊和行為,因此,封裝亦算是隱藏資訊;封裝使程式裡的性質(properties)、方法(methods)及其它成員能被使為一個單位或物件。
封裝這個動作得透過使用 存取規格符(access specifiers) 方可達成。存取規格符能控制類別成員的顯示範疇和可見性/能見度。封裝的好處很多:

  • 避免資料惡化(data corruption,資料的破壞或損失)
  • 釐清某類別裡的成員有哪些在類別以外還能用
  • 提升程式碼的延展性並降低其複雜程度
  • 減少物件間的耦合(coupling),更方便維護

C#的存取規格符有以下幾種:
public存取規格符(public access specifier)
用之前講解別的東西的程式碼解釋,冠上public的類別讓自己之外的函數和物件用到類別中的成員,如cube中的numbers():

using System;
namespace CubeApplication
{
    class Cube
    {
            int height;
            int width;
            int length;
        
        public void numbers()
        {
            height = 5;
            width = 5;
            length = 5;
        }
        public int value()
        { return height * length * width; }
        
        public void calc() { 
        
            Console.WriteLine("Height: {0}", height);
            Console.WriteLine("Length: {0}", length);
            Console.WriteLine("Width: {0}", width);
            Console.WriteLine("Volume: {0}", value());
        }

    }
    class calcube
    {
        static void Main(string[] args)	
        {
            Cube c = new Cube();
            c.numbers();
            c.calc();
            Console.ReadLine();
        }
    }
}

numbers()跟calc()calcube都能用到。

private存取規格符(private access specifier)
private將一個類別中的函數和變數設限制,只有自己類別中的函數才能使用,可說是和public相反(?)。若在應寫上存取規格符的地方沒有寫,那麼系統會將其預設為private。

protected存取規格符(protected access specifier)
使用此存取規格符讓子類別(child class)有權使用基礎類別(base class)中的成員變數及成員函數,在繼承的部分會再提到。

internal存取規格符(internal access specifier)
internal存取規格符標示的成員變數和函數在同一個組合(assembly)內都能使用。

protected internal存取規格符(protected internal access specifier)
使用此存取規格會對外部隱藏所有的成員變數和函數,只允許相同程式當中的子類別存取,這個存取規格符也會在繼承的部分提及。

寫這麼多了,覺得程式語言裡面好多東西環環相扣,有些部分漏掉什麼就沒有辦法徹底去了解它的全貌,像上面說的繼承(ˊˋ)只能說,繼續努力囉~~~

參考資料:
(a) Tutorialspoint; C# - Encapsulation
https://www.tutorialspoint.com/csharp/csharp_encapsulation.htm
(b) Techopedia; Encapsulation
https://www.techopedia.com/definition/3787/encapsulation-c


上一篇
Day 13: C#的迴圈 ʅ(ツ)ʃ
下一篇
Day 15:C#裡面的方法 ( ͡☉ ͜ʖ ͡☉)
系列文
初心者學C#30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言