天天看點

VB.net學習筆記(十一)我的形态差別:Me,MyClass,MyBase,My

前幾天美學課上,老師說到形态美,便舉例你看韓紅,

這麼多年沒留過長發,正是因為她明白短發才是最适合自己的形态美。

第一排的男生大聲的接了一句:“她可能是害怕留長發會被認成劉歡!”

看看基類、類、對角互動中使用Me,MyClass,MyBase的情況

一、Me

        Me 關鍵字為引用代碼正在運作的類或結構的特定執行個體提供了一條途徑。

        Me 的行為方式類似于引用目前執行個體的對象變量或結構變量。 

         在向另一個類、結構或子產品中的過程傳遞關于某個類或結構的目前執行執行個體的資訊時,使用 Me 尤其有用。

        結論:Me可以省略,它不會破壞既有的規則,比如重載、重寫、隐藏,它就是一個牆頭草,每個規則來了它都會适應。

                    重寫來了,它将遵循它的虛拟方法,按實際對象的類型來解釋Me;

                    隐藏來了,它将遵循它的非虛拟方法,按變量的類型來解釋Me;

                  它的作用僅僅就是少寫幾個字母。

           先在Person類中添加一個ToString方法

Public Overrides Function ToString() As String '重寫Object中的tostring
        Return Name
    End Function
           

           注意:1、為什麼在基本中用Overides?

                             因為.Net Framework中所有類最終都派生于System.Object。即使沒有使用Inherits,它也是如此。

                             故Person類是由Object類繼承而來,可用Overrides

                        2、預設情況下,ToString傳回類的名稱(即使沒有定義)。這個重寫成傳回Name屬性。

           然後,我們改寫主程式中的顯示:   

txtName.Text = .ToString
           

          我們還可以把ToString方法中,把Me添加上:

Public Overrides Function ToString() As String '重寫Object中的tostring
        Return Me.Name '多态時發生變化
    End Function
           

           但是這個是不必要的,對類中所有方法調用來說,Me就是預設的。不僅對重寫還是隐藏都是如此,是以上面顯式Me不影響

           通常,應省略Me,避免額外的輸入。

          下面看一下重寫時,Me的情況:    

          添加OfficeEmployee類,增加屬性OfficeNumber,并重寫Name屬性。        

Public Class officeEmployee
    Inherits Employee

    Private mOffice As String

    Public Property OfficeNumber() As String
        Get
            Return mOffice
        End Get
        Set(value As String)
            mOffice = value
        End Set
    End Property

    Public Overloads Overrides Property Name() As String
        Get
            Return MyBase.Name(NameType.informal) '傳回非正式中
        End Get
        Set(value As String)
            MyBase.Name = value  '基類存儲值
        End Set
    End Property

End Class
           

         注意:上例中MyBase指的是基類,即Employee。(而不是Person)

         主程式中代碼如下:運作一下,可以看到顯示的是Freddy

VB.net學習筆記(十一)我的形态差別:Me,MyClass,MyBase,My

       這是什麼原因呢?

         因為重寫發生虛拟方法。直接調用方法或者通過Me關鍵來調用方法時:

         會調用目前對象上的方法,是以這些方法調用會遵循和外部方法調用相同的規則,即,

        如果Tostring方法被繼承,其下的了類(Employee或OfficeEmployee)發生重寫,這個Me不再是Person,而是

        目前實際的對象類型(例中為OfficEmployee)。

         是以上例是這樣的:

         OfficeEmployee中對象temp,調用tostring(這是從Person繼承而來),于是使用Person的Tostring方法,該方法中的

         的Me不再是Person,而是OfficEmployee,即調用的是Temp.Name,這樣轉到本類代碼的Name屬性,這個屬性又

         傳回的是基類(Employee)的Name(nametype)屬性,轉到Employee代碼中提取Name(NameType)屬性,也就是非

         正式名Freddy。

         具體流程如下箭頭所示:

VB.net學習筆記(十一)我的形态差別:Me,MyClass,MyBase,My

          下面再看一下Me在隐藏情況下的表現:

          在OfficeEmployee類中,改變重寫代碼為隐藏,如下:

Public Shadows Property Name() As String
        Get
            Return MyBase.Name(NameType.informal)
        End Get
        Set(value As String)
            MyBase.Name = value
        End Set
    End Property
           

        主程式中,變量與引用對象類型改變一下:

VB.net學習筆記(十一)我的形态差別:Me,MyClass,MyBase,My

           可以看到,這裡它又遵循了隐藏的規則。

           變量類型為Employee,在調用toString,将進入Person版本的ToString,裡面用了Me.Name,這個Me就是目前的Employ,

           是以Name值就是Employee.Name(注意這裡不Person.Name,也不是OfficeEmployee.Name),是以值就是Fred。

         結論:Me不會影響重寫或隐藏的功能。同樣也說明了Me是可以省略的。

二、MyBase

         MyBase 關鍵字的行為方式類似于引用目前類執行個體的基類的對象變量。 

          MyBase 通常用于通路派生類中被重寫或被隐藏的基類成員。

          MyBase.New 用于從派生類構造函數中顯式調用基類構造函數。

         MyBase隻能引用直接父類,無法繼續沿繼承鍊向上定位。

         MyBase可以從父類中調用或使用任何Pulbic,Friend,Protected元素。

        無論是重寫還是隐藏,它都能突破這種限制,通路父類方法。

        如果說Me是牆頭草,那麼MyBase就是定神針,不為外界影響,直接可以引用基類元素。

        上例中,OfficeEmployee類中隐藏代碼:

Public Shadows Property Name() As String
        Get
            Return MyBase.Name(NameType.informal)
        End Get
        Set(value As String)
            MyBase.Name = value
        End Set
    End Property
           

         使用了MyBase,無論世界如何改變,它始終就固定位置到了父類Employee中。使用的是Employee中的方法。

         結論:突破重寫或隐藏的封鎖,用MyBase把基類的功能合并到子類中。

三、MyClass

        MyClass 關鍵字的行為方式類似于最初實作時引用類的目前執行個體的對象變量。 

        MyClass 類似于 Me,但調用前者的所有方法都被視為是 NotOverridable。

        MyClass固執地堅定自己,不會因外界的變化。

        可以說MyClass與MyBase都是一類角色,都不會因外界的變化而變,MyClass隻指向本類,MyBase隻指向父類。

       看一下變化:

       改變Person中ToString的方法,用MyClass,那麼它始終用的是Person版本Name。

Public Overrides Function ToString() As String '重寫Object中的tostring
        Return MyClass.Name  '強制使用本類版本
    End Function
           

       運作一下:

VB.net學習筆記(十一)我的形态差別:Me,MyClass,MyBase,My

       為什麼運作起來其值為空呢?

       因為上面主程式中,無論怎麼指派,Person版本中的Name值一直沒有指派,它一直是空串。

       是以,盡管用的是Temp.Tostring,它将調用Person中的ToSTring方法,而這個方法調用的是MyClass.Name,即調用的是

        Person.Name.

四、My 

       My 功能提供了容易而直覺的方法來通路大量 .NET Framework 類,

      進而使 Visual Basic 使用者能夠與計算機、應用程式、設定、資源等進行互動。

     可以把它看作是“系統”功能的調用。

結論:在類中,MyClass,MyBase起到不可替代的作用。

繼續閱讀