跳到主要內容

C#教材(4)類別與物件

類別與物件

  • 分類的意義

分類在物件導向中扮演重要的概念,通常我們要規畫一個系統可以物件根據特性或是屬性將他歸類到各個類別中,例如車子,不管是本田、賓士或BMW等等,它們都有共同的行為像加速、停止或是方向燈指示等等和共同的屬性像方向盤、輪胎和引擎。當我們將問題經由分析來歸類形成模組化。但是在我們將類別模組化的同時,我們需要保護裡面的資訊而不被任意更改,這種方式我們稱為封裝


共同行為共同屬性
加速
停止
方向燈指示
方向盤
引擎
車燈


  • 封裝

封裝可以保護物件裡面的資訊也可以適當的提供外面物件使用,所以我們也會將封裝稱為資訊隱藏(information hiding),主要有兩個概念
         
          1.將屬性或是方法封裝類別中,不給外面使用
          2.適當控制物件的方法與屬性,來提供外部物件使用
     

  •   類別的使用與定義

我們學習如何建立一個類別並建立裡面的方法與屬性,以上面可以知道,車子共同的行為與方法,可以寫成下列類別來表達,我們可以稱之它為Car類別:

class Car                                                                                                                                                      
{                                                                                                                                                                 
     //屬性定義                                                                                                                                    
     public string stringWheel ;                                                                                                                       
     public string light  ;                                                                                                                                
      
      //方法定義                                                                                                                                           
      public string Accelerate()                                                                                                                       
       {                                                                                                                                                          
            return "加速"      ;                                                                                                                            
       }                                                                                                                                                          
      public string Stop()                                                                                                                                                    
      {                                                                                                                                                             
            return "停止"       ;                                                                                                                             
      }                                                                                                                                                            
                                                                                                                                                                   
                                                                                                                                                              

  • 建構子


當利用關鍵字new建立物件時,也表示該物件會在記憶體中佔據一個位子,這時也會對該物件做初步的參數初始化,所以我們會將一些可以需要初始化的參數或是方法封裝在特定的函式名稱中,我們建構子(constructor)。

建構子用法與限制 :
    (1) 需要與類別名稱相同
    (2) 可以接收參數但不可以有回傳值
    (3) 可以多載建構子
    (4) 當無建立建構子,編輯器會預設產生建構子。

class Car                                                                                                                                                     
{           
       private string color ;    
       private int speed    ;                                                                                                               
  
      //建構子                                                                                                                                               
       public  Car()                                                                                                                     
       {                                                                                                                                                          
            color = "black" ;                                                                                                                           
            speed = 100 ;                                                                                                                
       }             
        //建構子-多載                                                                                                                                  
       public  Car(string color,int speed)                                                                                                                     
       {                                                                                                                                                          
            this.color = color ;                                                                                                                           
            this.speed = speed ;                                                                                                                
       }                                                                                                                                                           
                                                                                                                                                                   
                                                                                                                                                              


  • 存取範圍


當我們建立Car類別同時,也需建立該類別可以存取屬性和方法的範圍,我們可以從官方資料,以下這些資料,我們可以一一討論他們之間的關係

宣告存取範圍 意義
public 存取沒有限制。
protected 存取只限於繼承的衍生自包含類別的型別。
internal 存取只限於目前的組件。
protected internal 存取只限於目前的組件或衍生自包含類別的型別
private 存取只限於包含類別。


(1) public 公開修飾詞
以Car類別為例,當我們要呼叫Accelerate()方法時,首先要先在記憶體中建立分配一個空間給Car的物件,利用new關鍵字來建立實體物件,建立後會可以利用我們定義存取範圍來選擇適當的方法。由於上面的例子我們是利用public修飾詞做宣告,所以我們對Car類別沒有任何的限制,都可以做存取。


 class Program                                                                                                                                             
    {                                                                                                                                                             
        static void Main(string[] args)                                                                                                                                            
        {                                                                                                                                                         
            //建立Car類別物件                                                                                                                                                    
            Car BMW = new Car();                                                                                                                                                     
                                                                                                                                                                    
            System.Console.WriteLine(BMW.Stop());                                                                                             
           System.Console.WriteLine(BMW.Accelerate());                                                                              
        }                                                                                                                                                        
    }                                                                                                                                                            



(2) private 修飾詞
當我們考慮到車子的配備時,方向盤與車燈有可能是車廠獨自有的品牌,我們宣告public修飾詞造成資訊隱藏不夠,這是我們需要利用private修飾詞來達到更進一步的封裝,所以我將Car類別做一下修改並定義可以由車廠來設定他們獨自車的配備。由於外部給予參數和內部設定參數wheel和light名稱相同,為了區別它們之間不同,我們必須利用this來完成內部屬性的建立


  class Car                                                                                                                                                  
    {                                                                                                                                                            
        //共同屬性定義                                                                                                                                
        private  string wheel;                                                                                                                          
        private  string light;                                                                                                                              
                                                                                                                                                                  
        //共同方法定義                                                                                                                                
        public string Accelerate()                                                                                                                    
        {                                                                                                                                                        
            return "加速";                                                                                                                                 
        }                                                                                                                                                        
        public string Stop()                                                                                                                             
        {                                                                                                                                                        
            return "停止";                                                                                                                                 
        }                                                                                                                                                        
                                                                                                                                                                 
        //設定車子的配備                                                                                                                           
        public void setCarEquipment(string wheel, string light)                                                                       
        {                                                                                                                                                      
            this.wheel = wheel;                                                                                                                     
            this.light = light;                                                                                                                            
        }                                                                                                                                                     
                                                                                                                                                                
    }                                                                                                                                                          



 class Program                                                                                                                                             
    {                                                                                                                                                             
        static void Main(string[] args)                                                                                                                                           
        {                                                                                                                                                         
            //建立Car類別物件                                                                                                                      
            Car BMW = new Car();                                                                                                                
            BMW.setCarEquipment("米其林","BMW");                                                                                 
            BMW.showCarEquipment();                                                                                                          
        }                                                                                                                                                        
    }                                                                                                                                                            



結果:


(3)internal





  • 物件的生命周期

    當我們宣告一個物件實體時,系統會建立該實體在記憶體中,當我們不再參考該物件
    系統會自動的回收該物件的實體,釋放記憶體空間,



  • 靜態方法與資料

用static所需宣告方法與資料的為靜態成員,當我們將方法或是資料宣告為靜態成員時,表示
記憶體中會預先載入這些成員,當所有物件要使用(參照)這些靜態成員,不需要用在額外宣告
,而且他只會共用一份相同的函式庫。所以靜態類別不能實體化,不能使用 new 關鍵字建立類別型別的變數

Ex:


 class Math                                                                                                                                             
    {                                                                                                                                                             
                                                                                                                                                               
    }                                                                                                                                                            

[補充]

  • 匿名類別(anonymous)

匿名類別沒有類別名稱的類別,當然編譯器會替匿名取一個內部的名稱,才會進行編譯
。通常因為沒有型別,我們利用var宣告成隱含型變數。

*宣告方式
   var anonName = new { Name="John" , Age=42 } ;

  • 封裝方法(setter, getter )
  在實務上的應用,我們通常會用一個既定的模式去封裝物件,所謂setter就是屬性透過
   public的修飾詞來做儲存資料方式,getter就是將封裝的資料取出。

 [Net Framework 2.0]                                                              class Employee {                                                                                                                                                  private int _no ;                                                                private string _name ;                                                                                                                                          public int No {                                                                   set { this._no = value;}                                                         get { return value }                                                          }                                                                                                                                                              public int Name {                                                                   set {this._name= value;}                                                         get { return value }                                                          }                                                                             }                                                                                                                                                          
[Net Framework 3.5]                                                              class Employee {                                                                                                                                                 public int No { get ; set ;    }                                                public string Name { get ; set;}                                                                                                                               }                                                                            



  • 密封類別(sealed class)

密封類別用來限制父類別不可以被子類別繼承,這種好處主要是限制類別繼承的深度,

Ex:
    //宣告密封類別
    sealed class SealedClass
    {
        public const double PI = 3.1415F;
        public void work()
        {
            Console.WriteLine("密封類別不可以work繼承");
        }


    }

Ex: 繼承SealedClass,在編譯時會出現錯誤。
    class SubSealedClass :SealedClass
    {

    }







  • 抽象類別(Abstract class)

  當我們建造房子之前須要先去做藍圖的規劃,抽象類別通常是指一個想法或是架構,
  但未有實體的建造規格。當我們需要規劃一些共同抽象行為或是屬性,通常我們會先去
  規畫一個樣板(template)然後再由其他的子類別去override這些行為

  Ex:
   //制定房子的架構
    abstract class HourseTemplate
    {
        private string _hourseType;

        public string HourseType
        {
            get { return _hourseType; }
            set { _hourseType = value; }
        }

        abstract protected void Length(double l); //長度
        abstract protected void Width(double w);  //寬度
        abstract protected void Heigh(double h);  //高度
        abstract public double Volume();          //體積
        abstract protected void Condition(string condition);
     
    }


  class Department:HourseTemplate
    {
        private double w;
        private double l;
        private double h;
        private string condition;

        public Department(double length, double width, double heigh)
        {
            Length(length);
            Width(width);
            Heigh(heigh);
        }

        protected override void Length(double l)
        {
            this.l = l;
        }

        protected override void Width(double w)
        {
            this.w = w;
        }

        protected override void Heigh(double h)
        {
            this.h = h;
        }

        public override double Volume()
        {
            return this.l * this.w * this.h;
        }


        protected override void Condition(string condition)
        {
            throw new NotImplementedException();
        }
    }

 class Codominiun:HourseTemplate
    {
        private double w;
        private double l;
        private double h;
        private string condition;

        protected override void Length(double l)
        {
            this.l = l;
        }

        protected override void Width(double w)
        {
            this.w = w;
        }

        protected override void Heigh(double h)
        {
            this.h = h;
        }

        protected override void Condition(string condition)
        {
            this.condition = condition;
        }

        //自訂方法
        public double Area()
        {
            return this.l * this.w ;
        }

        public override double Volume()
        {
            return this.l * this.w * this.h;
        }
    }

        TestHourse.cs主程式

        public static void Main()
        {
            Department department = new Department(50,50,1000);
            department.HourseType = "大樓" ;
            Console.WriteLine("{0}:{1}", department.HourseType, department.Volume());    
        }









留言

這個網誌中的熱門文章

JavaBean 和POJO

前言 今天介紹JavaBean和POJO的不同,這兩個名詞在JAVA文章常常被拿來使用以及討論。在JDK1.1時候釋出才有的一個標準架構,很多時候常常被搞混,所以我們特別開闢一章來加以討論。POJO規範在企業級應用已經廣大的被使用的規範。 解釋 POJO : 全名為Plain-old-Java-object,只需要繼承Object就可以,沒有特定規定,只要建立的類別有setter/getter方法都可以稱為POJO JavaBean: JavaBean通常用來封裝多個物件成為單獨物件使用,規範比較嚴格,規則如下 規則 說明 1 需要實作序列(Serializable/Externalizable) 2 不能有參數的建構子( no-arg constructor) 3 需要有公用setter/getter 4 屬性必須要私人(private) 5 屬於特定POJO規則 比較 所有的JavaBean都為POJO,但是所有的POJO不一定為JavaBean 都可以當作重複元件 都必須序列化 特性都為可用性、易用性和持久化使用 - 應用 由圖我們可以知道POJO在應用程式中,主要用來存取資料庫資料達到持久化的目的,並提供給商業邏輯流程處理使用。這種POJO的架構提供程式人員開發時的可以很有規則將資料封裝並加以使用。 範例1. JavaBean(以員工為實例) JavaBean建立員工物件,可以發現Employee物件建構子沒有任何參數,屬性為私有化並setter/getter的命名方式。 //實作序列化 public class Employee implements java.io.Serializable{ private int id; private String name; //無參數建構子 public Employee(){} //以下實作setter/getter public void setId(int id){this.id=id;} public int getId(){return id;} public void setName(String ...

GSON基礎教學

GSON 前言 JSON是很常見的資料交換格式,在JAVA領域常用處理JSON的函式庫:GSON、FastXML和JSON-B,本章節會以GSON為主,學習目標如下 JSON格式說明 GSON 套件函式 GSON: 物件轉換JSON字串 GSON: JSON字串轉換物件 JSON 格式說明 JSON全名為JavaScript Object Notation,它是一種輕量級的資料交換格式,會大為流行的理由,主要是他比傳統用xml更輕巧且容易處理, JSON表達方式物件會用大括弧{},陣列則是用中括號[]。 用JSON字串來表達Employee的物件內容,由JSON字串可以知道物件name、age、sex和salary屬性。 JSON表示員工資料方式: {“name”:”Jack Bryant”, “age”:18, “sex”:”M”,”salary”:3500.00} JSON陣列表示方式: 跟我們使用JAVA的陣列方式類似,內容值可以是數字’、文字、布林、陣列、物件、null等等。 範例: 字串: [“紅”、”橙”、”黃”、”綠”、”青”、”藍”、”紫”} 布林: [true, true, false, false, true, true] GSON 套件函式 Gson為google所發布的函式庫,主要將物件與json字串之間的轉換時方便使用。當我們將JAVA物件轉換成JSON字串稱為 序列化 ,JSON字串轉換至JAVA物件稱為 反序列化 。 GSON: 物件轉換JSON字串 有了JSON基本概念後,我們進入本章重點,首先我們需要建立員工類別(Employee),定義如下 物件 屬性 員工類別 Employee name 名字 age 年紀 sex 性別 salary 薪水 /** * name:員工類別 */ public class Employee implements Serializable { //constructor public Employee(String name, double salary){ this.name = name; this.sala...

H2資料庫(1)-基本安裝與介紹

H2資料庫介紹 H2為嵌入式資料庫,使用java開發,跨平台且內含資料庫管理介面,好處開發階段方便開發人員使用。 比較 詳細比較表: http://www.h2database.com/html/features.html#comparison 由圖比較可以知道,H2比其他資料庫更為優勢,以下會介紹開發時常用的模式: 嵌入式模式Embedded Mode 嵌入式資料庫會與應用程式共用同一JVM底層,在這個模式下persistent或是in-memory資料庫都支援,也沒有連線數的限制。但壞處是只可以給該應用程式使用,其他人無法直接存取資料庫。 伺服器模式 Server Mode 外部應用程式可以藉由JDBC或是OBC的方式連結該資料庫,它也支援persistent或是in-memory資料庫,也沒有連線數的限制。 混合模式 Mixed Mode 同時有嵌入式與伺服器的模式去讓外部應用程式連線或是自己應用程式連線。 安裝H2 database 官方網站: http://www.h2database.com/html/main.html 下載安裝程式 出現安裝連結,本次範例使用 Windows installer 的安裝連結 下載安裝程式後,點擊兩下,進入安裝畫面,按”下一步” 一直按”下一步”後,會出現”完成” 安裝完成後,會出現一個說明網頁,你可以點選Quickstart 它會告訴你,如何進入DBRMS畫面以及開啟資料庫服務 開啟windows的視窗圖示,執行 H2 Console後,會執行H2資料庫 進入DBRMS的登入畫面,使用者預設為”SA”,密碼為空值”“,按下”connect”進入,SQL命令中心 登入後,可以在空白處執行SQL語法 8.大致上安裝H2資料庫滿快速,操作畫面也是很好上手,如果系統在開發階段個人覺的滿推薦給大家使用看看。 參考 H2官方網站