Da das hier mal immer weiter zu einem persönlichen Grabenkampf von der Seite des tollen Typen auszuarten scheint und mittlerweile schon eine sehr persönliche Sache wird...
Hier mal eine persönliche Beobachtung auch von meiner Seite:
@tollertyp: also mittlerweile kündigst du bereits zum zweiten Mal deinen Abschied an, doch irgendwie scheint dich diese Sache hier sehr zu faszinieren. Es scheint dich doch schon brennend zu interessieren, was hier im Thread abläuft. Ist das der Grund, warum du eine so wahrlich beeindruckende Anzahl von 11.482 Beiträgen am 06.11.2023 um 22:31 erreicht hast, obwohl du erst seit Februar 2020 dabei bist? Also aus meiner Sicht eine richtig gute Performance deinerseits, Respekt!
Ich habe da mal paar Fragen an dich (gerne auch per PM beantwortbar):
Wieviele Beiträge schreibst du so am Tag oder pro Woche?
Laut meiner Rechnung dürften das so Pi mal Daumen 8 Beiträge pro Tag sein, d.h. noch ein Kommentar hier im Thread und du hast erfolgreich dein Tagessoll erreicht.
In wievielen Unterforen bist du so durchschnittlich aktiv am diskutieren, z.B. pro Tag?
Aber gerne würde ich mal was teilen. Ich habe da mal so ein paar Untersuchungen meinerseits gemacht und würde sie gern mal zur Diskussion stellen...
ich war mal so frei und habe 2 Interfaces angelegt:
1. ITollerTyp (der wohlgemerkt in der Java-Ecke nach eigenem Bekunden sein eigentliches zu Hause hat)
2. IRossibaer (der wohlgemerkt nicht mehr so ganz im Programmieren fit ist)
Irgendwo gibt es da noch eine Klasse ComputerBaseMember, bei der nun beide Interfaces hinzugefügt wurden.
Also, ich habe da mal eine Instanz eines Objektes von der Klasse ComputerBaseMember erzeugt und nannte die entsprechende Variable dann einfach mal member.
Im weiteren Schritt machte ich eine Zuweisung von member zu einer Variable vom Typ ITollerTyp und nannte sie mal
@tollertyp.
Gleiches machte ich mit dem Interface IRossibar und nannte sie einfach sinnigerweise
@Rossibaer.
Darauf lies ich mir mal einfach ein paar Ausgaben auf der Konsole generieren:
In Zeile 7 und 8 sind dann die entsprechenden Aufrufe von Console.WriteLine().
In Zeile 11 und 12 habe ich mal die Ausgabe in Form eines Kommentars eingefügt.
Dann dachte ich mir, hey, wie wäre es, wenn ich einfach mal nur member in einer Konsolenausgabe versuche den Wert der readonly Property auszugeben.
Beobachtung #1: Der Compiler gab mir einen Fehler CS1061 - und sagte mir, dass die Property YearsOfMemberShip bei der Klasse ComputerBaseMember nicht implementiert ist.
Überlegung #1: Ok, ich hatte sie tatsächlich nicht in der Klasse implementiert, aber der Compiler hatte keine Probleme damit, die Klasse mit 2 Interfaces, die beide YearsOfMemberShip definiert haben, zu kompilieren. Erst als ich versuchte, über die Variable member auf die Property zuzugreifen, gabs den Fehler CS1061. Während ich bei den Variablen vom Typ ITollerTyp und Typ IRossibaer problemlos auf die Property YearsOfMemberShip zugreifen konnte, ist es bei der Variable member nicht möglich.
Frage #1: Kann es sein, dass diese Implementierungen der Interfaces vielleicht nur explizit ansprechbar sind?
Antwort: #1: Es deutet darauf hin.
Frage #2: Kann es sein, dass bei beiden Interfaces der Compilerfehler CS1061 nur dann auftritt, wenn die Property den gleichen Namen hat?
Antwort #2: Ich habe beide Properties unterschiedlich benannt und siehe da, selbst wenn sie unterschiedliche Namen hatten, kam der Fehler. Aber wenn ich mir halt den Fehler vom Text auch durchlese, passt es für mich ins Bild, da auch der Compiler halt sagt, die Property ist bei ComputerBaseMember nicht implementiert.
Schlussfolgerung #1: da es sich eher um explizite Implementierungen von den Interface Membern zu handeln scheint, sollte das Diamond-Problem also wahrscheinlich kein Problem sein. Soweit korrekt?
Schlussfolgerung #2: da die Klasse member die Property YearsOfMemberShip nicht implementiert, laut Fehler vom Compiler, dann scheint hier nicht wirklich eine Vererbung im Spiel zu sein, denn wenn doch etwas vererbt wurde, dann sollte doch entweder die eine oder die andere Implementierung in irgendeiner Form direkt über die Variable member erreichbar sein. Soweit korrekt?
Ich probierte dann das Spiel mit member und verwendete das Schlüsselwort "dynamic" und nannte dann diese dynamicMember, denn lag sehr nah, dass wir doch alle sehr dynamisch sind und auf unterschiedliche Reize reagieren.
Ergebnis: Im Grunde das gleiche, was mir der Compiler bei Verwendung von member.YearsOfMemberShip schon verboten hatte, nur dass dies dann per Laufzeit geschah (RuntimeBinderException). Wirklich interessant! Auch zur Laufzeit des Threads trat eine Ausnahme auf, weil keine Bindung erfolgen konnte. Soweit ich weiß, kommt doch bei den dynamischen Dingen doch auch irgendwann der Versuch einer Bindung zu Stande in dem zum Beispiel mal einfach reflektiert wird, oder?
Egal, weitere Untersuchungen folgen morgen... Den Quellcode des Garbage Collector schau ich mir sicherlich dann mal genauer an, bevor ich dann Gefahr laufe, im Mehr der Beiträge des tollen Typen unterzugehen, der ja bekanntlich auf ner sicheren Insel sitzt, während ich schwimme.
Edit:
@tollertyp Nochmal kurz geschaut, meine Erwähnung des Garbage Collector bezog sich auf die Tatsache, dass er auch auf die MethodTable, der von ihm verwalteten Objekt-Instanzen während des Verschiebens im Speicher Einfluß nimmt. Gibt da so eine sehr interessante RawSetMethodTable() Funktion, die im gc.cpp an einigen Stellen im GC aufgerufen wird. Da H4110 das Thema ansprach, wie wohl das mit den Methoden im .NET funktioniert und sich dann auf eine VTable aus dem C++ Umfeld mit Function-Pointern bezog, war halt mein Statement gerade auf diese Sache bezogen und hatte erstmal nichts per se mit einer vermeintlichen Mehrfachvererbung zu tun, wie du ja treffsicher in deiner unnachahmlichen Art bereits festgestellt hast oder zumindest implizit versuchtest auszudrücken.
Aber auch da wieder eine Fehlannahme meinerseits, da ich davon ausging, dass ich jetzt nicht unmittelbar jeden kleine Textschnipsel erst als Zitat einfügen muss, damit auch so hochperformante Multithread-Poster, wie du, dem Ganzen noch folgen können. In der Tat eine Wall Of Text zu produzieren ist halt doch etwas anstrengender, als mal kurz Bullshit-Bingo zu rufen und dann schnell wieder bei einem Win11 Thread weiter zu posten um dann grob gefühlte 26 Beiträge an einem Tag einzuheimsen... Gibts eigentlich nen Preis wenn man sagen wir mal so 100.000 Beiträge in einem Jahr schafft? Gibts da einen Amazon Gutschein für? Würde mich mal interessieren.