面向對象三大基本特徵之一——封裝之屬性

封裝

封裝的定義

封裝,即隱藏對象的屬性和實現細節,僅對外公開接口,控制在程序中屬性的讀和修改的訪問級別;將抽象得到的數據和行爲(或功能)相結合,形成一個有機的整體,也就是將數據與操作數據的源代碼進行有機的結合,形成“類”,其中數據和函數都是類的成員。舉個例子,比如洗衣機各個組件被封裝起來,只能通過按鈕來操作它們,這種隱藏內部實現,對外提供操作接口的方式,我們稱之爲封裝。

封裝的好處

封裝可以讓使用者不用擔心對象內部具體實現,同時又可以確保使用者無法更改內部代碼。它可以讓代碼更易於理解和維護,也加強了代碼的安全性。

定義屬性

如何定義屬性?

C#中屬性的作用是提供靈活的機制來讀寫私有字段的值。C#中屬性就是對字段的封裝,通過對字段的封裝,可以阻止不合法數據的錄入,從而保護內部數據的安全,提高字段訪問的安全性和靈活性。

C#中的屬性結合了字段和方法的優點,對於對象的使用者,調用屬性的方式和調用字段的方式相同;

對於類的使用者,屬性是兩個類似於方法的代碼塊,分別是get訪問器(訪問)和set訪問器(賦值)。

爲什麼要使用屬性?

在代碼中直接對類進行訪問,存在很大的缺陷,無法保證數據的合理性,此時我們可以使用屬性對字段進行封裝。

我們可以舉個例子來讓大家看一下。

新建一個控制檯應用程序,然後添加一個Customer類。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FengZhuang
{
    public class Customer //publc設置爲公開的類
    {
        public string name; //定義姓名
        public int age; //定義年齡
        public string address; //定義地址
    }
}

然後在Program類裏面實例化一個customer對象,並對Customer類的字段進行賦值。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FengZhuang
{
   public class Program
    {
        static void Main(string[] args)
        {
            Customer customer = new Customer(); //實例化一個customer對象
            customer.name = "張三";
            customer.age = 200;
            customer.address = "北京";

            //打印客戶信息
            Console.WriteLine("客戶信息:");
            Console.WriteLine("姓名:" + customer.name);
            Console.WriteLine("年齡:" + customer.age+"歲");
            Console.WriteLine("地址:" + customer.address);
        }
    }
}

運行結果如圖所示,年齡爲200歲,這樣的數據顯然是不合理的。
在這裏插入圖片描述

所以當我們直接對一個類中的字段進行直接訪問時,就會存在這一問題。如何避免這樣不合理的數據錄入?可以使用屬性對這樣的字段進行封裝。

使用屬性進行封裝的步驟?

1、私有化字段

2、定義屬性,並題庫set get訪問器對字段進行訪問

3、在set get訪問器中添加代碼保證數據的安全

如何使用屬性?

下面通過一個案例來演示一下如何在程序中使用屬性。

新建一個Customer類

namespace FengZhuang
{
    public class Customer //publc設置爲公開的類
    {
        public string name; //定義姓名字段
        private int age; //定義年齡字段
        
        //字段首字母小寫,屬性首字母大寫
        //封裝快捷鍵:選中需要封裝的字段,然後按Ctrl+R+E
        public int Age //定義Age屬性
        {
            get //get訪問器用來獲取字段的值
            {
                return age;
            }
            set //set訪問器,對當前字段進行賦值
            {
                //限定age的值
                if (value >=0 && value <=110)
                {
                    age = value;
                }
                else
                {
                    Console.WriteLine("年齡輸入有誤,默認設置爲18歲");
                    age = 18;
                }
            }
        }
        public string address; //定義地址字段
    }
}

在Program類中代碼如下:

namespace FengZhuang
{
   public class Program
    {
        static void Main(string[] args)
        {
            Customer customer = new Customer(); //實例化一個customer對象
            customer.name = "張三";
            customer.Age = 200; //age字段被私有化,只能通過Age屬性進行訪問
            customer.address = "北京";

            //打印客戶信息
            Console.WriteLine("客戶信息:");
            Console.WriteLine("姓名:" + customer.name);
            Console.WriteLine("年齡:" + customer.Age+"歲");
            Console.WriteLine("地址:" + customer.address);
        }
    }
}

此時,結果如圖所示:當我們輸入不合理的年齡200時,年齡被自動改成18歲,很好地避免了不合理數據的出現。
在這裏插入圖片描述

屬性的分類:

通過提供不同的訪問器,可以將屬性分爲以下3類:

1、只讀屬性:只含get訪問器

2、只寫屬性:只含set訪問器

3、讀寫屬性:包含get訪問器和set訪問器

下面通過一個案例來演示不同類型的屬性的定義和使用。

只寫屬性:set
在這裏插入圖片描述

當對數據進行讀取時,會報錯,缺少get(讀取)訪問器。
在這裏插入圖片描述
只讀屬性:get
在這裏插入圖片描述
當對數據進行賦值時,會報錯,缺少set(賦值)訪問器。
在這裏插入圖片描述

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