IEquatable Schnittstelle Fehler im Fehler?

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    IEquatable Schnittstelle Fehler im Fehler?

    Hallo,

    bei

    VB.NET-Quellcode

    1. Friend Class Test
    2. Implements IEquatable(Of Test)
    3. Public Function Equals(other As Test) As Boolean Implements IEquatable(Of Test).Equals
    4. Throw New NotImplementedException
    5. End Function
    6. End Class

    sagt er Equals führt Shadowing für die Overridable Methode aus Object durch. Overrides wird vorgeschlagen. Füge ich das ein sagt er es kann nicht als overrides deklariert werden weil es keine Methode in der Basisklasse überschreibt.

    Was muss ich hier machen?

    Viele Grüße
    Du hast einen Namens-Konflikt, also änder den Function-Name:

    VB.NET-Quellcode

    1. Friend Class Test
    2. Implements IEquatable(Of Test)
    3. Private Function IEquatable_Equals(other As Test) As Boolean Implements IEquatable(Of Test).Equals
    4. Throw New NotImplementedException
    5. End Function
    6. End Class

    Ansonsten hat fichz schon recht: nur mit dem Interface ists nicht getan - es ist unbedingt sicherzustellen, dass das Vergleichs-Verhalten kongruent ist mit anderen Vergleichs-Methoden, wie: overrides Equals, overrides GetHashCode, = - Operator, ggfs auch >, < - Operatoren.
    Aber das steht ja im Artikel (und im Beispiel)

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

    Ok das sind verschiedene Überladungen und die kann alleine die eigentliche Equals nicht überschreiben. Hab ich das richtig verstanden?
    Ich mache es so dann gehts. Mit Namenskonklift sagt er mir nix

    VB.NET-Quellcode

    1. Friend Class Test
    2. Implements IEquatable(Of Object)
    3. Implements IEquatable(Of Test)
    4. Friend Property p1 as Integer
    5. Friend Property p2 as Integer
    6. Public Overloads Function Equals(other As Test) As Boolean Implements IEquatable(Of Test).Equals
    7. If p1 <> other.p1 Then Return False
    8. Return p2 = other.p2
    9. End Function
    10. Public Overrides Function Equals(other As Object) As Boolean Implements IEquatable(Of Object).Equals
    11. Dim castedOther = TryCast(other, Test)
    12. If castedOther Is Nothing Then Return False
    13. Return Equals(castedOther)
    14. End Function
    15. End Class

    Du kannst auch mit Shadows statt mit Overrides arbeiten, dann geht das sytaktisch auch erstmal, weil dann die Equals-Methode der Basisklasse ausgeblendet wird.

    VB.NET-Quellcode

    1. Friend Class Test
    2. Implements IEquatable(Of Test)
    3. Public Shadows Function Equals(other As Test) As Boolean Implements IEquatable(Of Test).Equals
    4. Throw New NotImplementedException
    5. End Function
    6. End Class

    Ist nur die Frage: Geht es um Verständnis der Funktionsweise oder hast Du eine Anwendung des ganzen im Blick? Was soll am Ende wirklich verglichen werden? Eine Datenbank-Eintrags-ID?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Haudruferzappeltnoch schrieb:

    Mit Namenskonklift sagt er mir nix
    Probier einfach mein Code aus - der geht.
    Implementiere nicht mehrere IEquatables für dieselbe Klasse.
    Also das Implements IEquatable(Of Object) muss weg - die entsprechende Methode funzt auch ohne das.

    (PS: Wenn du was lernen willst, ist "xx sagt mir nichts, aber so gehts..." keine Strategie.)

    ErfinderDesRades schrieb:

    xx sagt mir nichts
    steht da aber nicht. Da steht, dass der Compiler nicht mehr zum Thema Namenskonflikt meckert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @ErfinderDesRades
    Ne ich meinte das Visual Studio sieht da keinen Namenskonflikt, bzw. weiß ich nicht was du damit meinst.

    Den Code hat auch das Studio so erzeugt, als ich die IEquatable Schnittstelle rengebaut habe, also den Namen habe ich mir nichtmal ausgedacht oder so.
    Die Frage ist, wenn ich das umbennene, dann macht er zwar auch die Warnung weg, aber nutzt er trotzdem diese MEthode zum Vergleich in List<T>.Contains?

    @VaporiZed Ja geht mir schon ums Verständnis, gerade Shadows habe ich mehr als Schutzwort verstanden also eher das es was verhindert, als das es etwas ermöglicht.
    Was da genau vergleichen wird ist schwer zu erklären ohne den ganzen Kontext zu posten. Es ist der Key einer DB, aber der wird außerhalb des DB kontexts verglichen also ich kann nicht explizit den Key suchen oder so.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Ja, man könnte sagen, dass Shadows "verhindert". Ein Beispiel:

    VB.NET-Quellcode

    1. Class FooList : Inherits List(Of Foo)
    2. Sub Add(Name As String, CreationDate As Date)
    3. '…
    4. End Sub
    5. End Class

    Das Add ohne Zusatz geht nicht, weil bereits die Basisklasse List(Of T) eine Add-Methode hat. Overrides geht nicht, weil das die Basisklasse erlauben muss. Overloads ginge, um eine zusätzliche Add-Methode einzubauen, damit Du mit DeineFooList.Add(EinFoo) und mit DeineFooList("Test", Date.Today) arbeiten kannst. Wenn Du hingegen Shadows verwendest, wird die Add-Methode der Basisklasse unzugänglich und Du kannst nur noch Deine Add-Methode verwenden. Ist manchmal ganz praktisch.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Gibts hier eigentlich ein Tut zu diesen ganzen Wörtern? Weil manchmal sind die durchaus austauschbar. Wenn der Member Add Overridable wäre, dann würde Overrides ja dasgleiche machen.
    Ich dachte Shadows verhindert das dieser Member nochmal ausgeblendet werden kann, weil am Ende sagt mir VS ja bei IEquatable genau das wenn ich nichts dazuschreibe, dass der trotzdem schon Shadowed. Dann wäre das Hinzufügen von Shadows ja widerum keine Änderung

    @ErfinderDesRades
    Btw. Ich hab die andere Implementierung (Of Object) rausgenommen Equals(other as Object) kann ich ja trotzdem überschreiben, weil jede Klasse Object inherited.
    Ohne Zusatz weist Dich Visual Studio darauf hin, dass es bereits in der Basisklasse eine gleichlautende Methode gibt und das thoretisch (!) zu einem Shadowing führen würde. Das wird aber mit einem Fehler abgelehnt, damit man sowas nicht versehentlich macht und dadurch die Klassenfunktionalität stört. Um dem Compiler jetzt klarzumachen, was Deine Intention ist, musst Du entweder einen Zusatz vergeben oder einen anderen Methodennamen wählen.
    Dass der VS-Vorschlag, doch einfach Overrides zu verwenden zu einem Folgefehler führt, steht auf einem anderen Blatt und ist wahrscheinlich vom VS-Entwicklerteam nicht beabsichtigt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Haudruferzappeltnoch schrieb:

    Mit Namenskonklift sagt er mir nix
    Sorry - im Falschverstehen binnich garnet so schlecht.

    Haudruferzappeltnoch schrieb:

    Den Code hat auch das Studio so erzeugt, als ich die IEquatable Schnittstelle rengebaut habe, also den Namen habe ich mir nichtmal ausgedacht oder so.
    Tja, manchmal ist das, was der Editor da so hineingeneriert, eben nicht so gut.
    Der Programmierer sitzt halt vor der Kiste, nicht darin.

    Haudruferzappeltnoch schrieb:

    Gibts hier eigentlich ein Tut zu diesen ganzen Wörtern?
    Nicht dassichwüsste.
    Scheint mir auch nicht nötig, weil die Schlüsselworte sind ich finde ausgezeichnet dokumentiert: learn.microsoft.com/de-de/dotn…guage-reference/keywords/
    Der Versuch eines Rewrite vons das auf vbParadise wird kaum eine Verbesserung bringen.

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