<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 面向對象編程 > 原文: [https://zetcode.com/lang/visualbasic/oopi/](https://zetcode.com/lang/visualbasic/oopi/) 在 Visual Basic 教程的這一部分中,我們將討論 Visual Basic 中的面向對象的編程。 那里有三種廣泛使用的編程范例。 過程編程,函數式編程和面向對象的編程。 Visual Basic 支持過程式編程和面向對象的編程。 面向對象編程(OOP)是一種使用對象及其相互作用設計應用和計算機程序的編程范例。 (維基百科) OOP 中有一些基本的編程概念: * 抽象 * 多態 * 封裝 * 繼承 抽象通過建模適合該問題的類來簡化復雜的現實。 多態是將運算符或函數以不同方式用于不同數據輸入的過程。 封裝對其他對象隱藏了類的實現細節。 繼承是一種使用已經定義的類形成新類的方法。 ## 對象 對象是 Visual Basic OOP 程序的基本構建塊。 對象是數據和方法的組合。 在 OOP 程序中,我們創建對象。 這些對象通過方法進行通信。 每個對象都可以接收消息,發送消息和處理數據。 創建對象有兩個步驟。 首先,我們創建一個類。 類是對象的模板。 這是一個藍圖,描述了類對象共享的狀態和行為。 一個類可以用來創建許多對象。 在運行時從類創建的對象稱為該特定類的實例。 ```vb Option Strict On Module Example Class Being End Class Sub Main() Dim b as New Being Console.WriteLine(b.ToString()) End Sub End Module ``` 在第一個示例中,我們創建一個簡單的對象。 ```vb Class Being End Class ``` 這是一個簡單的類定義。 模板的主體為空。 它沒有任何數據或方法。 ```vb Dim b as New Being ``` 我們創建`Being`類的新實例。 為此,我們使用了`New`關鍵字。 `b`變量是創建對象的句柄。 ```vb Console.WriteLine(b.ToString()) ``` 對象的`ToString()`方法給出了該對象的一些基本描述。 ```vb $ ./object.exe Example+Being ``` 由于類定義為空,因此我們沒有太多信息。 我們獲得對象類名稱和模塊名稱,該對象的實例在此處創建。 ## 對象屬性 對象屬性是捆綁在類實例中的數據。 對象屬性稱為實例變量或成員字段。 實例變量是在類中定義的變量,該類中的每個對象都有一個單獨的副本。 ```vb Option Strict On Module Example Class Person Public Name As String End Class Sub Main() Dim p1 as New Person p1.Name = "Jane" Dim p2 as New Person p2.Name = "Beky" Console.WriteLine(p1.Name) Console.WriteLine(p2.Name) End Sub End Module ``` 在上面的 Visual Basic 代碼中,我們有一個帶有一個成員字段的`Person`類。 ```vb Class Person Public Name As String End Class ``` 我們聲明一個`Name`成員字段。 `Public`關鍵字指定可以在`Class` `End Class`塊之外訪問成員字段。 ```vb Dim p1 as New Person p1.Name = "Jane" ``` 我們創建`Person`類的實例。 并將`Name`變量設置為`"Jane"`。 我們使用點運算符來訪問對象的屬性。 ```vb Dim p2 as New Person p2.Name = "Beky" ``` 我們創建`Person`類的另一個實例。 在這里,我們將變量設置為`"Beky"`。 ```vb Console.WriteLine(p1.Name) Console.WriteLine(p2.Name) ``` 我們將變量的內容打印到控制臺。 ```vb $ ./person.exe Jane Beky ``` 我們看到了程序的輸出。 `Person`類的每個實例都有`Name`成員字段的單獨副本。 ## 方法 方法是在類主體中定義的函數/過程。 它們用于通過對象的屬性執行操作。 在 OOP 范式的封裝概念中,方法至關重要。 例如,我們的`AccessDatabase`類中可能有一個`Connect`方法。 我們無需通知`Connect`如何精確地連接到數據庫。 我們只知道它用于連接數據庫。 這對于劃分編程中的職責至關重要,尤其是在大型應用中。 ```vb Option Strict On Module Example Class Circle Public Radius As Integer Public Sub SetRadius(ByVal Radius As Integer) Me.Radius = Radius End Sub Public Function Area() As Double Return Me.Radius * Me.Radius * Math.PI End Function End Class Sub Main() Dim c As New Circle c.SetRadius(5) Console.WriteLine(c.Area()) End Sub End Module ``` 在代碼示例中,我們有一個`Circle`類。 我們定義了兩種方法。 ```vb Public Radius As Integer ``` 我們只有一個成員字段。 它是圓的`Radius`。 `Public`關鍵字是訪問說明符。 它表明該變量可以從外界完全訪問。 ```vb Public Sub SetRadius(ByVal Radius As Integer) Me.Radius = Radius End Sub ``` 這是`SetRadius()`方法。 這是一個正常的 Visual Basic 過程。 `Me`變量是一個特殊變量,我們用它來訪問方法中的成員字段。 ```vb Public Function Area() As Double Return Me.Radius * Me.Radius * Math.PI End Function ``` `Area()`方法返回圓的面積。 `Math.PI`是內置常數。 ```vb $ ./circle.exe 78.5398163397448 ``` 運行示例。 ## 訪問修飾符 訪問修飾符設置方法和成員字段的可見性。 Visual Basic 具有五個訪問修飾符:`Public`,`Protected`,`Private`,`Friend`和`ProtectedFriend`。 `Public`成員可以從任何地方訪問。 `Protected`成員只能在類本身內部以及繼承的和父類訪問。 可以從同一程序集(exe 或 DLL)中訪問`Friend`成員。 `ProtectedFriend`是受保護的修飾符和朋友修飾符的組合。 訪問修飾符可防止意外修改數據。 它們使程序更強大。 ```vb Option Strict On Module Example Class Person Public Name As String Private Age As Byte Public Function GetAge() As Byte Return Me.Age End Function Public Sub SetAge(ByVal Age As Byte) Me.Age = Age End Sub End Class Sub Main() Dim p as New Person p.Name = "Jane" p.setAge(17) Console.WriteLine("{0} is {1} years old", _ p.Name, p.GetAge) End Sub End Module ``` 在上面的程序中,我們有兩個成員字段。 一個聲明為`Public`,另一個聲明為`Private`。 ```vb Public Function GetAge() As Byte Return Me.Age End Function ``` 如果成員字段是`Private`,則訪問它的唯一方法是通過方法。 如果要在類外部修改屬性,則必須將方法聲明為`Public`。 這是數據保護的重要方面。 ```vb Public Sub SetAge(ByVal Age As Byte) Me.Age = Age End Sub ``` `SetAge()`方法使我們能夠從類定義之外更改私有`Age`變量。 ```vb Dim p as New Person p.Name = "Jane" ``` 我們創建`Person`類的新實例。 因為`Name`屬性是`Public`,所以我們可以直接訪問它。 但是,不建議這樣做。 ```vb p.setAge(17) ``` `SetAge()`方法修改`Age`成員字段。 由于已聲明`Private`,因此無法直接訪問或修改。 ```vb Console.WriteLine("{0} is {1} years old", _ p.Name, p.GetAge) ``` 最后,我們訪問兩個成員以構建一個字符串。 ```vb $ ./modifiers.exe Jane is 17 years old ``` Running the example. ```vb Option Strict On Module Example Class Base Public Name As String = "Base" Protected Id As Integer = 5323 Private IsDefined As Boolean = True End Class Class Derived Inherits Base Public Sub Info() Console.WriteLine("This is Derived Class") Console.WriteLine("Members inherited:") Console.WriteLine(Me.Name) Console.WriteLine(Me.Id) 'Console.WriteLine(Me.IsDefined) End Sub End Class Sub Main() Dim drv As Derived = New Derived drv.Info() End Sub End Module ``` 在前面的程序中,我們有一個`Derived`類,該類繼承自`Base`類。 `Base`類具有三個成員字段。 全部具有不同的訪問修飾符。 `IsDefined`成員未繼承。 `Private`修飾符可以防止這種情況。 ```vb Class Derived Inherits Base ``` 類`Derived`繼承自`Base`類。 ```vb Console.WriteLine(Me.Name) Console.WriteLine(Me.Id) 'Console.WriteLine(Me.IsDefined) ``` `Public`和`Protected`成員由`Derived`類繼承。 可以訪問它們。 `Private`成員未繼承。 訪問成員字段的行被注釋。 如果我們取消注釋該行,它將無法編譯。 ```vb $ ./protected.exe This is Derived Class Members inherited: Base 5323 ``` 運行程序,我們收到此輸出。 `Public`和`Protected`成員是繼承的,`Private`成員則不是。 ## 方法重載 方法重載允許創建多個具有相同名稱的方法,它們的輸入類型彼此不同。 方法重載有什么好處? Qt4 庫提供了一個很好的用法示例。 `QPainter`類具有三種繪制矩形的方法。 它們的名稱為`drawRect()`,其參數不同。 一個引用一個浮點矩形對象,另一個引用一個整數矩形對象,最后一個引用四個參數,`x`,`y`,`width`,`height`。 如果開發 Qt 的 C++ 語言沒有方法重載,則庫的創建者必須將其命名為`drawRectRectF()`,`drawRectRect()`和`drawRectXYWH()`之類的方法。 方法重載的解決方案更為優雅。 ```vb Option Strict On Module Example Class Sum Public Function GetSum() As Integer Return 0 End Function Public Function GetSum(ByVal x As Integer) As Integer Return x End Function Public Function GetSum(ByVal x As Integer, _ ByVal y As Integer) As Integer Return x + y End Function End Class Sub Main() Dim s As Sum = New Sum Console.WriteLine(s.getSum()) Console.WriteLine(s.getSum(20)) Console.WriteLine(s.getSum(20, 30)) End Sub End Module ``` 我們有三種方法`GetSum()`。 它們的輸入參數不同。 ```vb Public Function GetSum(ByVal x As Integer) As Integer Return x End Function ``` 這一個參數。 ```vb Console.WriteLine(s.getSum()) Console.WriteLine(s.getSum(20)) Console.WriteLine(s.getSum(20, 30)) ``` 我們調用這三種方法。 ```vb $ ./overloading.exe 0 20 50 ``` 這就是我們運行示例時得到的。 ## 構造器 構造器是一種特殊的方法。 創建對象時會自動調用它。 構造器的目的是初始化對象的狀態。 Visual Basic 中構造器的名稱為`New`。 構造器是方法,因此它們也可以重載。 ```vb Option Strict On Module Example Class Being Sub New() Console.WriteLine("Being is being created") End Sub Sub New(ByVal name As String) Console.WriteLine("Being {0} is created", name) End Sub End Class Sub Main() Dim b As New Being Dim t As New Being("Tom") End Sub End Module ``` 我們有一個`Being`類。 此類具有兩個構造器。 第一個不帶參數,第二個不帶參數。 ```vb Sub New(ByVal name As String) Console.WriteLine("Being {0} is created", name) End Sub ``` 該構造器采用一個`String`參數。 ```vb Dim b As New Being ``` 創建`Being`類的實例。 這次,在創建對象時調用沒有參數的構造器。 ```vb $ ./constructor.exe Being is being created Being Tom is created ``` 這是程序的輸出。 在下一個示例中,我們初始化類的數據成員。 變量的初始化是構造器的典型工作。 ```vb Option Strict On Module Example Class MyFriend Private Born As Date Private Name As String Sub New(ByVal Name As String, ByVal Born As Date) Me.Name = Name Me.Born = Born End Sub Public Sub GetInfo() Console.WriteLine("{0} was born on {1}", _ Me.Name, Me.Born.ToShortDateString) End Sub End Class Sub Main() Dim name As String = "Lenka" Dim born As Date = #5/3/1990# Dim fr As MyFriend = New MyFriend(name, born) fr.GetInfo() End Sub End Module ``` 我們有一個帶有數據成員和方法的`Friend`類。 ```vb Private Born As Date Private Name As String ``` 類定義中有兩個變量。 `Private`關鍵字是訪問修飾符。 它是一種封裝。 `Private`關鍵字是限制性最強的修飾符。 它僅允許有問題的對象訪問變量。 沒有子孫,沒有其他物件。 ```vb Sub New(ByVal Name As String, ByVal Born As Date) Me.Name = Name Me.Born = Born End Sub ``` 在構造器中,我們啟動兩個數據成員。 `Me`變量是用于引用對象變量的處理器。 ```vb Dim fr As MyFriend = New MyFriend(name, born) fr.GetInfo() ``` 我們創建帶有兩個參數的`Friend`對象。 然后,我們調用對象的`GetInfo()`方法。 ```vb ./constructor2.exe Lenka was born on 5/3/1990 ``` ## 類常量 Visual Basic 可以創建類常量。 這些常量不屬于具體對象。 他們屬于類。 按照約定,常量用大寫字母表示。 ```vb Option Strict On Module Example Class Math Public Const PI As Double = 3.14159265359 End Class Sub Main() Console.WriteLine(Math.PI) End Sub End Module ``` 我們有一個帶有`PI`常量的`Math`類。 ```vb Public Const PI As Double = 3.14159265359 ``` `Const`關鍵字用于定義常數。 ```vb $ ./classconstant.exe 3.14159265359 ``` 運行示例。 ## `ToString()`方法 每個對象都有一個`ToString()`方法。 它返回對象的人類可讀表示。 默認實現返回對象類型的標準名稱。 請注意,當我們使用對象作為參數調用`Console.WriteLine()`方法時,將調用`ToString()`。 ```vb Option Strict On Module Example Class Being Public Overrides Function ToString As String Return "This is Being Class" End Function End Class Sub Main() Dim b as New Being Dim o As New Object Console.WriteLine(o.ToString()) Console.WriteLine(b.ToString()) Console.WriteLine(b) End Sub End Module ``` 我們有一個`Being`類,其中我們重寫了`ToString()`方法的默認實現。 ```vb Public Overrides Function ToString As String Return "This is Being Class" End Function ``` 創建的每個類都從基`Object`繼承。 `ToString()`方法屬于此`Object`類。 我們使用`Overrides`關鍵字來通知我們正在覆蓋方法。 ```vb Dim b as New Being Dim o As New Object ``` 我們創建兩個對象。 一種自定義定義,一種內置。 ```vb Console.WriteLine(o.ToString()) Console.WriteLine(b.ToString()) ``` 我們在這兩個對象上調用`ToString()`方法。 ```vb Console.WriteLine(b) ``` 正如我們之前指定的,在對象上調用`Console.WriteLine()`將調用其`ToString()`方法。 ```vb $ ./override.exe System.Object This is Being Class This is Being Class ``` 這是我們運行腳本時得到的。 ## 繼承 繼承是使用已經定義的類形成新類的方法。 新形成的類稱為派生的類,我們派生的類稱為基類。 繼承的重要好處是代碼重用和降低程序的復雜性。 派生類(后代)將覆蓋或擴展基類(祖先)的功能。 ```vb Option Strict On Module Example Class Being Sub New() Console.WriteLine("Being is created") End Sub End Class Class Human Inherits Being Sub New() Console.WriteLine("Human is created") End Sub End Class Sub Main() Dim h As New Human End Sub End Module ``` 在此程序中,我們有兩個類。 基類`Being`和派生的`Human`類。 派生類繼承自基類。 ```vb Class Human Inherits Being ``` 在 Visual Basic 中,我們使用`Inherits`關鍵字創建繼承關系。 ```vb Dim h As New Human ``` 我們實例化派生的`Human`類。 ```vb $ ./inheritance.exe Being is created Human is created ``` 我們可以看到兩個構造器都被調用了。 首先,調用基類的構造器,然后調用派生類的構造器。 接下來是一個更復雜的示例。 ```vb Option Strict On Module Example Class Being Dim Shared Count As Integer = 0 Sub New() Count = Count + 1 Console.WriteLine("Being is created") End Sub Sub GetCount() Console.WriteLine("There are {0} Beings", Count) End Sub End Class Class Human Inherits Being Sub New() Console.WriteLine("Human is created") End Sub End Class Class Animal Inherits Being Sub New Console.WriteLine("Animal is created") End Sub End Class Class Dog Inherits Animal Sub New() Console.WriteLine("Dog is created") End Sub End Class Sub Main() Dim h As New Human Dim d As New Dog d.GetCount() End Sub End Module ``` 我們有四個類。 繼承層次更加復雜。 `Human`和`Animal`類繼承自`Being`類。 `Dog`類直接繼承自`Animal`類,并間接繼承自`Being`類。 我們還介紹了`Shared`變量的概念。 ```vb Dim Shared Count As Integer = 0 ``` 我們定義一個`Shared`變量。 共享成員是類的所有實例共享的成員。 在其他編程語言中,它們稱為靜態成員。 ```vb Sub New() Count = Count + 1 Console.WriteLine("Being is created") End Sub ``` 每次實例化`Being`類時,我們都會將`Count`變量加 1。 這樣,我們就可以跟蹤創建的實例數。 ```vb Class Animal Inherits Being ... Class Dog Inherits Animal ... ``` `Animal`繼承自`Being`,`Dog`繼承自動物。 `Dog`也間接繼承自`Being`。 ```vb Dim h As New Human Dim d As New Dog d.GetCount ``` 我們從`Human`和`Dog`類創建實例。 我們稱為`Dog`對象的`GetCount()`方法。 ```vb $ ./inheritance2.exe Being is created Human is created Being is created Animal is created Dog is created There are 2 Beings ``` `Human`對象調用兩個構造器:`Dog`對象調用三個構造器。 有兩個實例化的存在。 ## 抽象類和方法 抽象類無法實例化。 如果一個類至少包含一個抽象方法,則也必須將其聲明為抽象方法。 抽象方法無法實現,它們僅聲明方法的簽名。 當我們從抽象類繼承時,所有抽象方法都必須由派生類實現。 此外,必須以較少受限制的可見性聲明這些方法。 與接口不同,抽象類可能具有完全實現的方法,并且可能具有定義的成員字段。 因此,抽象類可以提供部分實現。 程序員經常將一些通用功能放入抽象類中。 這些抽象類隨后會被子類化以提供更具體的實現。 例如,Qt 圖形庫具有`QAbstractButton`,它是按鈕小部件的抽象基類,提供按鈕所共有的功能。 按鈕`Q3Button`,`QCheckBox`,`QPushButton`,`QRadioButton`和`QToolButton`都從此基本抽象類繼承。 正式地說,抽象類用于強制執行協議。 協議是一組操作,所有實現對象都必須支持。 ```vb Option Strict On Module Example MustInherit Class Drawing Protected x As Integer = 0 Protected y As Integer = 0 Public MustOverride Function Area() As Double Public Function GetCoordinates() As String Return String.Format("x: {0}, y: {1}", _ Me.x, Me.y) End Function End Class Class Circle Inherits Drawing Private Radius As Integer Sub New(ByVal x As Integer, ByVal y As Integer, _ ByVal r As Integer) Me.x = x Me.y = y Me.Radius = r End Sub Public Overrides Function Area() As Double Return Me.Radius * Me.Radius * Math.PI End Function Public Overrides Function ToString() As String Return String.Format("Circle, at x: {0}, y: {1}, radius: {2}", _ Me.x, Me.y, Me.Radius) End Function End Class Sub Main() Dim c as New Circle(12, 45, 22) Console.WriteLine(c) Console.WriteLine("Area of circle: {0}", c.Area()) Console.WriteLine(c.GetCoordinates()) End Sub End Module ``` 我們有一個抽象基類`Drawing`。 該類定義兩個成員字段,定義一個方法并聲明一個方法。 一種方法是抽象的,另一種是完全實現的。 `Drawing`類是抽象的,因為我們無法繪制它。 我們可以畫一個圓,一個點或一個正方形。 `Drawing`類對我們可以繪制的對象具有一些通用功能。 ```vb MustInherit Class Drawing ``` 在 Visual Basic 中,我們使用`MustInherit`關鍵字定義抽象類。 ```vb Public MustOverride Function Area() As Double ``` 抽象方法前面帶有`MustOverride`關鍵字。 ```vb Class Circle Inherits Drawing ``` 圓是`Drawing`類的子類。 它必須實現抽象`Area()`方法。 ```vb $ ./abstractclass.exe Circle, at x: 12, y: 45, radius: 22 Area of circle: 1520.53084433746 x: 12, y: 45 ``` 程序的輸出。 這是 Visual Basic 中 OOP 描述的第一部分。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看