Me, MyBase, MyClass Unterschiede?

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von fichz.

    Me, MyBase, MyClass Unterschiede?

    yo Leute,

    hab eine Frage zu MyClass.
    Ich weiß nicht genau was eigentlich passiert wenn man MyClass anspricht.

    Anhand MSDN wurde mir klar was die anderen 2 (Me, MyBase) bedeuten.
    Jedoch werd ich auch von MSDN bei MyClass nicht schlau.

    Könnte hierzu jemand ein Beispiel zeigen? Denke dann versteh ich den Sinn dahinter besser.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Also ich habe gerade einen Haufen Tests gemacht. MyClass hat sich nie von Me unterschieden.
    Mann wird MyClass wahrscheinlich sowieso so gut wie nie brauchen.

    Edit:
    Klassen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Class BaseClass
    2. Public Overridable Sub MustOverrideSub()
    3. Form1.AddLog("- BaseClass.MustOverrideSub")
    4. End Sub
    5. Public Sub TestBase()
    6. Form1.AddLog("Me.MustOverrideSub")
    7. Me.MustOverrideSub()
    8. Form1.AddLog("MyClass.MustOverrideSub")
    9. MyClass.MustOverrideSub()
    10. End Sub
    11. End Class
    12. Class MiddleClass
    13. Inherits BaseClass
    14. Public Overrides Sub MustOverrideSub()
    15. Form1.AddLog("- MiddleClass.MustOverrideSub")
    16. End Sub
    17. Public Sub TestMiddle()
    18. Form1.AddLog("Me.MustOverrideSub")
    19. Me.MustOverrideSub()
    20. Form1.AddLog("MyBase.MustOverrideSub")
    21. MyBase.MustOverrideSub()
    22. Form1.AddLog("MyClass.MustOverrideSub")
    23. MyClass.MustOverrideSub()
    24. End Sub
    25. End Class
    26. Class SubClass
    27. Inherits MiddleClass
    28. Public Overrides Sub MustOverrideSub()
    29. Form1.AddLog("- SubClass.MustOverrideSub")
    30. End Sub
    31. Public Sub TestSub()
    32. Form1.AddLog("Me.MustOverrideSub")
    33. Me.MustOverrideSub()
    34. Form1.AddLog("MyBase.MustOverrideSub")
    35. MyBase.MustOverrideSub()
    36. Form1.AddLog("MyClass.MustOverrideSub")
    37. MyClass.MustOverrideSub()
    38. End Sub
    39. End Class

    Form1:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. 'Wrapper, um Logs anzuzeigen
    3. Public Shared Sub AddLog(Message As String)
    4. RaiseEvent AddLogEvent(Message)
    5. End Sub
    6. Private Shared Event AddLogEvent(Message As String)
    7. Private Sub AddLogHandler(Message As String)
    8. ListBox1.Items.Add(DateTime.Now.ToLongTimeString & "." & DateTime.Now.Millisecond.ToString.PadLeft(3, "0"c) & " : " & Message)
    9. End Sub
    10. Private Sub Initialize() Handles MyBase.Load
    11. AddHandler AddLogEvent, AddressOf AddLogHandler
    12. End Sub
    13. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    14. AddLogHandler("------BaseClass Instanz------")
    15. Dim BaseInstance As New BaseClass
    16. BaseInstance.TestBase()
    17. AddLogHandler("------MiddleClass Instanz------")
    18. Dim MiddleInstance As New MiddleClass
    19. MiddleInstance.TestMiddle()
    20. AddLogHandler("------SubClass Instanz------")
    21. Dim SubInstance As New SubClass
    22. SubInstance.TestSub()
    23. End Sub
    24. End Class


    Ergibt:


    Ich habe keinen Unterschied zwischen Me und MyClass gefunden. Wird wahrscheinlich erst bei komplizierteren Konstruktionen interessant.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()

    Ich hatte auch schon ein bisschen was probiert (hab dieses MyClass ja ausn Entwicklerbuch) aber eben auch keine Unterschiede feststellen können.
    Deswegen ist es eben interesannt ob es einen/welche gibt, da dies beim Klassendesign ja nicht unwesentlich ist.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    myclass ist erforderlich, wenn man mehrere Konstruktoren schreibt, um den einen Konstruktor vom anneren aus aufrufen zu können.

    VB.NET-Quellcode

    1. Public Class ChooseView(Of T) : Inherits ListCollectionView
    2. Private _Source As IList(Of T)
    3. Public Sub New()
    4. MyClass.New(New ObservableCollection(Of T))
    5. End Sub
    6. Public Sub New(ByVal sourceList As IList(Of T))
    7. MyBase.New(DirectCast(sourceList, IList))
    8. _Source = sourceList
    9. End Sub
    Der parameterlose Konstruktor erzeugt als Default-Einstellung eine ObservableCollection für die _Source.
    @ErfinderDesRades: Das ist vielleicht ein etwas ungünstiges Beispiel, da _Source ja auch so beschrieben werden könnte, oder?
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Bei einem einfachen Parameter, der übergeben wird, ists noch nicht soo erheblich, da könnteman auch schreiben

    VB.NET-Quellcode

    1. Public Class ChooseView(Of T) : Inherits ListCollectionView
    2. Private _Source As IList(Of T)
    3. Public Sub New()
    4. _Source = New ObservableCollection(Of T)
    5. End Sub
    6. Public Sub New(ByVal sourceList As IList(Of T))
    7. MyBase.New(DirectCast(sourceList, IList))
    8. _Source = sourceList
    9. End Sub

    Aber bei mehreren konstruktoren, mehreren Parametern und vlt. mehr Konstruktor-Logik wirds sehr wichtig, Code-Redundanzen zu vermeiden

    VB.NET-Quellcode

    1. <Diagnostics.DebuggerDisplay("Count={Count}, MinHeap={MinHeap}")> _
    2. Public Class Heap(Of T) : Implements ICloneable
    3. 'ein Heap ist ein sortierter, balancierter binärer Baum, im Array (hier: List(of T)) abgebildet.
    4. 'Die beiden Children eines Parents liegen immer genau hinter dem doppelten Index der Parents.
    5. 'Heap-Bedingung (bei MinHeap): beide Children eines Parents müssen größer sein.
    6. ''' <summary>return 1, 0, -1, depending on key is smaller, equal or bigger than item</summary>
    7. Public ReadOnly KeyIsSmaller As Func(Of IComparable, T, Integer)
    8. ''' <summary>return 1, 0, -1, depending on item is bigger, equal or smaller than key</summary>
    9. Public ReadOnly KeyIsBigger As Func(Of IComparable, T, Integer)
    10. Public ReadOnly Selector As Func(Of T, IComparable)
    11. ''' <summary>whether the root-element is Minimum</summary>
    12. Public ReadOnly MinHeap As Boolean = True
    13. Public InnerList As New List(Of T)()
    14. Public Sub New(ByVal Selector As Func(Of T, IComparable), ByVal minHeap As Boolean)
    15. Me.Selector = Selector
    16. Me.MinHeap = minHeap
    17. Dim KeyCompareToItem = Function(key As IComparable, item As T) key.CompareTo(Selector(item))
    18. Dim ItemCompareToKey = Function(key As IComparable, item As T) Selector(item).CompareTo(key)
    19. KeyIsSmaller = If(minHeap, KeyCompareToItem, ItemCompareToKey)
    20. KeyIsBigger = If(minHeap, ItemCompareToKey, KeyCompareToItem)
    21. End Sub
    22. ''' <summary>copy-constructor</summary>
    23. Public Sub New(ByVal hp As Heap(Of T))
    24. MyClass.New(hp.Selector, hp.MinHeap)
    25. InnerList.AddRange(hp.InnerList)
    26. End Sub
    Also hier zB die Logik der Zeilen #18 - #23 im CopyKonstruktor zu wiederholen wäre fehleranfällig, insbes. wenn man den ersten Konstruktor mal verändert.

    Aber für was anneres als für überladene Konstruktoren habich MyClass auch noch nie verwendet

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    man lernt nie aus.

    Also jetzt weißich garnimmer, wozu MyClass gut sein soll. Mussich nochmal den Link lesen, vlt. steht da ja was drin (puh! englisch!)


    Ah - ja:

    link schrieb:

    MyClass is similar to Me, but all method calls on it are treated as if the method were NotOverridable.