密封屬性

来源:http://www.cnblogs.com/bb-love-dd/archive/2016/10/29/6011373.html
-Advertisement-
Play Games

網上收集的這些,感覺還不錯 函數等集合在一個個的單元中(我們稱之為類)。被封裝的對象通常被稱為抽象數據類型。在本文中,我們將詳細學習屬性的特性。 封裝的概念 可以把程式按某種規則分成很多“塊“,塊與塊之間可能會有聯繫,每個塊都有一個可變部分和一個穩定的部分。我們需要把可變的部分和穩定的部分分離出來, ...


網上收集的這些,感覺還不錯
函數等集合在一個個的單元中(我們稱之為類)。被封裝的對象通常被稱為抽象數據類型。在本文中,我們將詳細學習屬性的特性。
封裝的概念
可以把程式按某種規則分成很多“塊“,塊與塊之間可能會有聯繫,每個塊都有一個可變部分和一個穩定的部分。我們需要把可變的部分和穩定的部分分離出來,將穩定的部分暴露給其他塊,而將可變的部分隱藏起來,以便於隨時可以讓它修改。這項工作就是封裝.
例如:在用類實現某個邏輯的時候,類就是以上所說的塊,實現功能的具體代碼就是可變的部分,而public的方法或者屬性則是穩定的部分。
封裝的意義

封裝的意義在於保護或者防止代碼(數據)被我們無意中破壞。在面向對象程式設計中數據被看作是一個中心的原素並且和使用它的函數結合的很密切,從而保護它不被其它的函數意外的修改。
封裝提供了一個有效的途徑來保護數據不被意外的破壞。相比我們將數據(用域來實現)在程式中定義為公用的(public)我們將它們(fields)定義為私有的(privat)在很多方面會更好。
私有的數據可以用兩種方式來間接的控制。下麵我們看一些c#例子來學習這兩種方法用以封裝數據。第一種方法,我們使用傳統的存、取方法。第二種方法我們用屬性(property)。無論我們使用哪種的方法,我們的目標是在使用數據的同時不能使它受到任何的破壞和改變。有如下好處

其一: 使用者只需要瞭解如何通過類的介面使用類,而不用關心類的內部數據結構和數據組織方法。
其二:高內聚,低耦合一直是我們所追求的,用好封裝恰恰可以減少耦合
其三:只要對外介面不改變,可以任意修改內部實現,這個可以很好的應對變化
其四:類具有了簡潔清晰的對外介面,降低了使用者的學習過程
用傳統的讀、寫方法封裝

讓我們來看一個例子有一個類Department,為了操縱這個類中的數據(string departname)我們定義了一個讀方法和一個寫方法。
using system;
public class Department
{
private string departname;
.......
// 讀方法
public string GetDepartname()
{
return departname;
}
//寫方法
public void SetDepartname( string a)
{
departname=a;
}
}
通過上面的方法,我們可以保護私有數據不被外部程式所破壞。

常用的是使用這個!!!!
c#使用屬性封裝 
1、使用屬性封裝方法
2、AccessModifer Type PropertyName
{get{...}set{...}
}
public int {get{ return this.X}set{this.x=rangeCheckX(value)}
}
2、屬性對某個欄位封裝時,命名規則,首字母大寫
private int employeeID;public int EmployeeID
{get{return this.EmployeeID;};set{this.EmployeeID=value}
}
3、介面中定義屬性
interface IScreenPosition
{
int X{get;set;}
int Y{get;set;}
}


4、實例化同時賦值
static void DoWork()
        {
            Polygon square = new Polygon();
            Polygon triangle = new Polygon { NumSides = 3 };
            Polygon pentagon = new Polygon { SideLength = 15.5, NumSides = 5 };

            Console.WriteLine("Square: number of sides is {0}, length of each side is {1}", 
                square.NumSides, square.SideLength);
            Console.WriteLine("Triangle: number of sides is {0}, length of each side is {1}", 
                triangle.NumSides, triangle.SideLength);
            Console.WriteLine("Pentagon: number of sides is {0}, length of each side is {1}", 
                pentagon.NumSides, pentagon.SideLength);
        }



詳細請看它::::
c#中的屬性 

   在C#中我們可以很自由的訪問共有欄位,但有時我們可能需要某欄位只能讀或者寫,或在改變欄位值得時候做一些其他事情,顯然這些僅僅依靠欄位是無法實現的,於是便有了屬性。 
   1、基本用法
   c#中的屬性由屬性作用域中定義的get作用域(訪問方法)和set作用域(訪問方法)構成。
class Test
{
private int number;

    //int表示該屬性所封裝的數據類型
    //數據類型必須與相應的欄位(number)相同   
    public int Num
    {
        get{return number;}
        set{number=value;}
    }
}

   當封裝數據時,可能希望配置一個只讀屬性。為此,可以忽略set塊。類似,如果想擁有一個只讀屬性,就忽略get塊。 
   2、靜態屬性  
   C#靜態屬性可以是讀寫屬性,只讀屬性,只寫屬性中的任意一種。靜態訪問器適用於整個類,而不是類的實例。靜態屬性中的set,get訪問器只能訪問類的靜態成員。靜態屬性可以通過類名訪問,不能使用實例調用,這與靜態方法相同。
//簡單的儲蓄賬戶類
class SavingAccount
{
//實例級別的數據
public double currBalance;

   //靜態數據點 
   private static double currInterestRate = 0.04; 

   //靜態屬性
   public static double InterestRate
   {
     get{return currInterestRate;}
     set{currInterestRate=value;}
   }                    
 }

 
   3、自動屬性
   自動屬性可以簡化封裝數據欄位的過程,減輕了定義私有返回欄位和相關c#屬性成員的工作。在定義自動屬性時,只指定訪問修飾符、實際的數據類型、屬性名稱和空的get/set作用域。在編譯時,編譯器為類型自動生成了私有返回欄位和適當的get/set實現邏輯。
class Enemy
{
//自動屬性
public string Name{get;set;}
public int Life{get;set;}
public float Attack{get;set;}

 }

   註意:與傳統的屬性不同的是,不允許構建只讀或只寫的自動屬性,自動屬性定義是必須同時支持讀寫功能。但是定義更嚴格的get或set是可以的
 
   4、關於自動屬性和預設值
   可以直接在代碼中使用封裝了數字或布爾數據的自動屬性,因為隱藏的返回欄位將設置一個可以直接使用的安全的預設值。但如果自動屬性封裝了另一個類變數,隱藏的私有引用類型的預設值將設為null。
   例如下麵的類spawn,使用了兩個自動屬性
class Spawn
{
//隱藏的int欄位預設值為0
public int numbers{get;set;}
//隱藏的Enemy返回欄位為null
public Enemy MyEnemy{get;set;}
}
   當直接調用MyEnemy時,將會在運行時得到空引用異常,因為沒有為後臺使用的Enemy成員變數設置新的對象。
   由於私有的返回欄位是在編譯時創建的,所以不能直接使用new關鍵字直接分配引用類型,必須在類的構造函數內部執行,以確保對象以安全方式誕生。
class Spawn
{
//隱藏的int欄位預設值為0
public int numbers{get;set;}
//隱藏的Enemy返回欄位為null
public Enemy MyEnemy{get;set;}

      //必須用構造函數重寫分配給隱藏返回欄位的預設值 
      public Spawn()
      {
         MyEnemy = new Enemy();
         numbers = 1;
      }
  
      public Spawn(Enemy enemy, int num)
      {
         MyEnemy = enemy;
         numbers = num;
      }
 }

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 我們在使用 "$top" 的時候有一列NI參數,這個參數就是進程的nice值,用來表示進程在系統調度中的優先順序,Linux中的進程nice從 20到+19,越小表明調度的優先順序越高,用戶進程的最小nice值就是0,比這個還要小的都是系統進程,非管理員不允許指定小於0的進程 `$nice n [新的n ...
  • 相關結構 相關函數 主調用 如果函數調用失敗,都返回 1,調用失敗會在全局變數error里有相應的值 不涉及到讀取、發送的時候,調用正常都返回0 socket() 創建套接字 family: 協議或地址族,TCP/IP為PF_INET,(ipv6為PF_INET6),也可以使用AF_INET typ ...
  • 最近剛換了新的筆記本電腦,終於使用上intel i7處理器,可以使用硬體虛擬化技術安裝系統。配置如下: 主機 ThinkPad P50s OS Window 10 虛擬機軟體 Oracle VirtualBox (個人感覺速度很快,並且可以創建相容 VMWare 和Hyper-V的虛擬機文件格式) ...
  • Hello World! ——《新手指南之玩轉實驗樓》第1節 實驗介紹 本節主要介紹電腦相關技術的基本概念,面向完全沒有編程經驗的朋友. 電腦體系 電腦系統 人機交互 編程語言種類 我的操作 1.電腦相關技術基本概念介摘錄 電腦體系: 電腦是一個很龐大的體系,主要領域可以包括:電腦系統 ...
  • [TOC] mdev說明 mdev是busybox自帶的一個簡化版的udev,適合嵌入式應用場合。其具有使用簡單的特點。它的作用就是在 系統啟動 和 熱插拔 或 動態載入驅動程式 時,自動產生驅動程式所需要的節點文件。在以busybox為基礎構建嵌入式linux根文件系統時,使用它時最優的選擇。 m ...
  • ...
  • 創建鏡像 創建鏡像的方法有三種: 基於已有的容器創建 基於本地模板導入 基於dockerfile 基於已有的容器創建 主要使用docker commit 命令,命令格式: docker commit [OPTIONS] CONTAINER [REPOSITORY[:tag]],主要包括: -a ,- ...
  • 為了加快系統運行效率,一般情況下系統會採用緩存技術,將常用信息存放到緩存中,避免頻繁的從資料庫、文件中讀寫,造成系統瓶頸,從而提高響應速度。緩存分為客戶端緩存和伺服器端緩存。 目前隨著系統的擴展,伺服器端緩存一般採取兩級緩存技術,本地緩存和分散式緩存。部分常用、公共或者小數據量的信息保存在分散式緩存 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...