2024年5月31日 星期五

10.VB.NET 核心篇 筆記 - 類別(Class)

VB.NET 類別 (Class) 筆記 (核心篇)

VB.NET 類別 (Class) 筆記(核心篇)

類別的本質

類別就像是一個設計圖,它定義了一組具有相似特性和行為的物件。就像建築師繪製的建築平面圖一樣,類別描述了物件的屬性(如窗戶、門、牆壁等)以及物件可以執行的方法(如開門、關窗等)。當我們根據類別建立物件時,就像是根據建築平面圖建造一棟真實的房子。每個物件都是獨立的個體,但都遵循著相同的設計規範。

類別 vs. 物件:

  • 類別是物件的藍圖或模板,定義了物件的屬性和行為。
  • 物件是類別的實例,根據類別的定義建立而成,每個物件都有自己獨特的屬性值。

使用類別可以有效地組織和管理程式碼,提高程式的可讀性、可維護性和可重用性。通過將相關的屬性和方法封裝在一個類別中,我們可以創建出模組化、結構化的程式碼,使得開發和維護變得更加容易。

類別的語法

在 VB.NET 中,類別的基本語法如下:

Public Class [類別名稱]
  '類別的屬性(變數)
  '類別的方法(函數)
End Class

其中:

  • [類別名稱]:類別的名稱,應該使用有意義的名稱,遵循 Pascal 命名法Pascal 命名法指的是每個單字的首字母都大寫,例如 MyClass、UserProfile 等。

在類別內部,我們可以定義類別的屬性和方法:

  • 屬性:表示類別的資料成員,用於儲存物件的狀態或資料。
  • 方法:表示類別的函數成員,用於定義物件的行為或操作。

存取修飾詞

在定義類別的屬性和方法時,我們可以使用存取修飾詞來控制它們的可見性和存取範圍。常用的存取修飾詞包括:

  • Public:表示該成員可以在任何地方被訪問,包括類別外部。
  • Private:表示該成員只能在類別內部被訪問,外部無法直接訪問。
  • Protected:表示該成員可以在類別內部以及其派生類別中被訪問。

選擇適當的存取修飾詞可以幫助我們實現封裝封裝是物件導向程式設計的一個重要原則,它指的是將類別的內部資料和實現細節隱藏起來,只提供必要的公共介面供外部使用。,隱藏類別的內部實現細節,提供良好的資料保護和安全性。

類別的使用案例

創建和使用類別

以下範例展示了如何創建一個簡單的 Person 類別,並在 Windows Form 中使用它:

所需元件:
  • TextBox1:用於輸入人名
  • Button1:用於觸發建立物件和顯示訊息
Public Class Person
  ' 定義 Person 類別的屬性
  Private _name As String

  ' 定義 Person 類別的建構函式
  Public Sub New(name As String)
    _name = name
  End Sub

  ' 定義 Person 類別的方法
  Public Function GetGreeting() As String
    Return "Hello, my name is " & _name
  End Function
End Class

Public Class Form1
  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ' 1\. 取得文字方塊中的人名
    Dim name As String = TextBox1.Text

    ' 2\. 建立 Person 物件
    Dim person As New Person(name)

    ' 3\. 呼叫 Person 類別的方法
    Dim greeting As String = person.GetGreeting()

    ' 4\. 顯示訊息
    MessageBox.Show(greeting)
  End Sub
End Class

這個範例演示了如何定義一個 Person 類別,包含了一個_name屬性、一個建構函式和一個GetGreeting()方法。在 Windows Form 的按鈕點擊事件中,我們建立了一個 Person 物件,並呼叫了它的 GetGreeting() 方法,最後將結果顯示在訊息方塊中。

使用屬性和方法

以下範例展示了如何在類別中定義和使用屬性和方法:

所需元件:
  • TextBox1:用於輸入矩形的寬度
  • TextBox2:用於輸入矩形的高度
  • Button1:用於觸發計算面積
  • Label1:用於顯示計算結果
Public Class Rectangle
  ' 定義 Rectangle 類別的屬性
  Private _width As Double
  Private _height As Double

  ' 定義 Rectangle 類別的屬性存取器
  Public Property Width() As Double
    Get
      Return _width
    End Get
    Set(value As Double)
      _width = value
    End Set
  End Property

  Public Property Height() As Double
    Get
      Return _height
    End Get
    Set(value As Double)
      _height = value
    End Set
  End Property

  ' 定義 Rectangle 類別的方法
  Public Function CalculateArea() As Double
    Return _width * _height
  End Function
End Class

Public Class Form1
  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    ' 1\. 建立 Rectangle 物件
    Dim rect As New Rectangle()

    ' 2\. 設定 Rectangle 物件的屬性值
    rect.Width = CDbl(TextBox1.Text)
    rect.Height = CDbl(TextBox2.Text)

    ' 3\. 呼叫 Rectangle 類別的方法
    Dim area As Double = rect.CalculateArea()

    ' 4\. 顯示計算結果
    Label1.Text = "矩形面積:" & area.ToString()
  End Sub
End Class

這個範例定義了一個 Rectangle 類別,包含了 WidthHeight 兩個屬性,以及一個 CalculateArea() 方法用於計算矩形的面積。在 Windows Form 的按鈕點擊事件中,我們建立了一個 Rectangle 物件,設定了它的屬性值,並呼叫了 CalculateArea() 方法計算面積,最後將結果顯示在標籤控制項中。

這個範例展示了如何使用屬性來封裝類別的資料,並提供公共的存取器來讀取和設定屬性值。同時,也展示了如何使用方法來定義類別的行為或操作。

進階用法

建構函式

建構函式是一種特殊的方法,用於在建立類別的實例時初始化物件的狀態。它與類別同名,沒有返回值。以下是一個使用建構函式的範例:

Public Class Person
  Private _name As String
  Private _age As Integer

  ' 定義 Person 類別的建構函式
  Public Sub New(name As String, age As Integer)
    _name = name
    _age = age
  End Sub

  ' 定義 Person 類別的方法
  Public Function GetIntroduction() As String
    Return "My name is " & _name & " and I am " & _age & " years old."
  End Function
End Class

Public Class Form1
  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    ' 建立 Person 物件,並傳遞參數給建構函式
    Dim person As New Person("John", 25)

    ' 呼叫 Person 類別的方法
    MessageBox.Show(person.GetIntroduction())
  End Sub
End Class

在這個範例中,Person 類別定義了一個接受 nameage 參數的建構函式。當我們使用 New 關鍵字建立 Person 物件時,必須提供對應的引數來初始化物件的狀態。

繼承

繼承是物件導向程式設計的一個重要概念,它允許我們建立一個新的類別,該類別是基於現有類別的延伸和專門化。以下是一個使用繼承的範例:

Public Class Animal
  Protected _name As String

  Public Sub New(name As String)
    _name = name
  End Sub

  Public Overridable Function MakeSound() As String
    Return "The animal makes a sound."
  End Function
End Class

Public Class Dog
  Inherits Animal

  Public Sub New(name As String)
    MyBase.New(name)
  End Sub

  Public Overrides Function MakeSound() As String
    Return "The dog barks."
  End Function
End Class

Public Class Form1
  Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim animal As New Animal("Generic Animal")
    Dim dog As New Dog("Buddy")

    MessageBox.Show(animal.MakeSound())
    MessageBox.Show(dog.MakeSound())
  End Sub
End Class

在這個範例中,我們定義了一個 Animal 基底類別,它有一個 _name 屬性和一個 MakeSound() 方法。接著,我們定義了一個 Dog 類別,它繼承自 Animal 類別,並覆寫了 MakeSound() 方法以提供特定於狗的實現。

當我們建立 AnimalDog 物件並呼叫它們的 MakeSound() 方法時,會根據物件的實際類型呼叫相應的實現。這展示了繼承的強大功能,它允許我們建立階層化的類別結構,並透過覆寫方法來提供專門化的行為。

類別的使用限制

雖然類別是一個強大的工具,但它也有一些使用限制:

  • 類別的設計需要仔細考慮,不當的設計可能導致程式的複雜性增加,可讀性和可維護性降低。
  • 過度使用類別可能導致程式的效能下降,因為建立和銷毀物件需要一定的開銷。
  • 類別的繼承關係需要謹慎設計,不當的繼承階層可能導致程式的僵化和難以擴充。
  • 類別的多態性雖然強大,但如果濫用可能導致程式變得難以理解和除錯。