Allgemeine Fragen (Interfaces, Vererbung, etc.)

  • Allgemein

Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von Artentus.

    Allgemeine Fragen (Interfaces, Vererbung, etc.)

    Hey Community!

    Also ich bin momentan eine Art forgeschrittener Anfänger ^^
    Ich habe bereits einige Projekte geschrieben / am Laufen, und beherrsche die deutsche Sprache (wie leider nicht alle hier...) ;)

    Nunja, .Net ist ja OOP, und außerdem sehr sehr vielfältig.
    Imho ist es bei einem Projekt notwendig, eigene Klassen (außer die Form-Class bei WinForms logischerweise) noch zu verwenden, weil 1000 Lines hardcoding in einer Klasse iwie nicht so toll aussehen. Also will ich mich damit mehr beschäftigen.
    Momentan sind meine Probleme einfach, dass ich das Klassen-System noch nicht so ganz verstanden habe:

    1. Jede eigene Klasse kann als Typ einer Variable verwendet werden, richtig ?
    2. Man nutzt die XML-Documentation (Kommentare) für IntelliSense, richtig ?
    3. Interfaces sind eine Art Verträge. Somit weiß ich, wenn eine Klasse bspw. IDisposable implementiert, das die Sub vorhanden sein wird ?
    4. Was genau ist der Unterschied zwischen Implements (Vererbung ?) und Inherits ?
    5. Was sind die groben Unterschiede der Präfixe bei Deklarationen (Private, Shared, Protected, etc.) ?
    6. Wenn ich eine Variable einen Typ zuweise, dann kann ich dieser Variable jeden Wert zuweisen, dessen Typ eine Klasse ist, welche von der Variablenklasse erbt , oder (Polymorphie ?) ?
    7. Wenn der Tyo einer Variable ein Interface ist, dann muss der Zuweisungswert doch nur eine Klasse haben, welche dieses Interface erbt (implementiert ?) oder ?
    8. Bei Subs / Functions Optional nutzen oder Überladungen ?
    9. Sollte ich Arrays komplett vermeiden ?
    10. Ist es 'falsch' Klassen in Klassen zu erstellen ?
    11. UserControls haben ja keine EventHandler, sondern die Subs "OnPaint", "OnMouseDown" usw., und in denen wird das Event am Anfang nochmal ausgelöst... Bespielweise also die Sub Protected Overrides Sub OnMouseDown(e As MouseEventArgs) und dann kommt direkt in die erste Zeile MyBase.MouseDown(e), warum ?


    So, ich erwarte nicht das jemand das alles beantwortet, ich habs nummeriert damit halt immer was 'rausgepickt' werden kann, egal ob direkte Antwort oder Links (egal ob Englisch oder Deutsch), und sobald die Frage beantwortet ist, werde ich sie streichen.
    Ich danke jedem im voraus für Antworten! :)
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

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

    Moin,

    zu 1.: Ja
    zu 2.: Ja
    zu 3.: Ja
    zu 4.: Implements implementiert ein Interface, während Inherits eine Klasse erbt
    zu 5.:
    • Public: Öffentlich (für alles und jeden sichtbar)
    • Private: Privat (nur in dieser Klasse sichtbar)
    • Protected: Nur für erbende Klassen sichtbar
    • Shared: Ein statischer Member, auf den ohne Instanz zugegriffen werden kann

    zu 6.: Ja
    zu 7.: Ja
    zu 8.: Ich präferiere Optional, da man damit keine Subs/Functions hat, die einfach nur den Aufruf mit weiteren Werten versehen und weiterreichen.
    zu 9.: Nein. Es gibt Stellen bei denen Array sinvoll sind. Zum Beispiel Puffer.
    zu 10.: Eher ja. Es verschlechtert die Wartbarkeit des Codes.
    zu 11.: Damit das Control auch weiß, dass diese Sub aufgerufen wurde.
    Mit freundlichen Grüßen,
    Thunderbolt
    1. Ja.
    2. Ja.
    3. Ja.
    4. Implements verwendest du, wenn du in einer Klasse ein Interface implementieren möchtest, und Inherits, wenn du eine Klasse beerben möchtest.
    5. Private heißt, nur die Klasse selbst kann darauf zugreifen, bei Protected kann die Klasse und ihre Erben darauf zugreifen, Friend heißt, man kann nur innerhalb des Projektes darauf zugreifen und bei Public kann man von überall darauf zugreifen. Shared kennzeichnet Member, die nicht von einer Instanz abhängig sind.
    6. Ja.
    7. Im Prinzip ja, allerdings können neben Klassen auch Strukturen Interfaces implementieren, die dann ebenso für eine Zuweisung gültig sind.
    8. Lieber Überladungen, ist einfacher zu verwalten und sieht in IntelliSense besser aus.
    9. Nein. Listen oder andere Auflistungen immer nur verwenden, wenn du sie wirklich brauchst, denn Arrays sind schneller.
    10. Theoretisch nicht, aber es macht Dinge eher komplizierter. Geschachtelte Klassen sollte man nur verwenden, wenn die innerere Klasse Private ist, also nur die äußere klasse sie kennt. Soll die innere Klasse auch nach außen hin verfügbar sein, sollte man sie lieber einzeln stellen und dann lieber Namespaces zum Sortieren verwenden.
    11. Die On...-Methoden in einer Klasse (können auch andere Klassen als (User-)Controls sein) lösen das entsprechende Event aus. Sie sind dafür da, dass eine abgeleitete Klasse die Events auslösen kann (weil über RaiseEvent gehts nicht, wie du vielleicht schon bemerkt hast) und auch, damit eine abgeleitete Klasse nicht das Event abonnieren muss (ist ein bisschen performanter so). Die Events existieren trotzdem und theoretisch kannst du sie auch abonnieren. MyBase... musst du dann immer aufrufen, damit das Event auch gefeuert wird, also du musst aus deiner neuen Implementierung die alte Implementierung, die du überdeckst, aufrufen. Wenn du das nicht tust, kann möglicherweise unvorhergesehenes Verhalten auftreten, weil notwendiger Code nicht ausgeführt wurde.
    Shared hat nichts mit Private, Public etc. zu tun. Private, Public, Protected,... sind Zugriffsmodifizierer welche angeben ob und inwiefern auf etwas zugegriffen werden kann.
    Shared gibt an, dass etwas nicht durch eine Instanz eines Objektes verfügbar ist sondern durch das Objekt bzw. den Typ an sich.

    Außerdem noch kurz anzumerken. Wenn du eine schöne XML-Doku hast, kannst du diese auch extrahieren und so eine Art Doku-Datei generieren lassen. > wird dann sowas: de.wikipedia.org/wiki/CHM_(Dateiformat)


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    1) richtig
    2) Sollte man nutzen ja.
    3) richtig. Wenn du nun eine Methode machen würdest welche als Paramter eine Variable vom Typ IDisposable benötigt, kannst du jedes Objekt welches IDisposable implementiert übergeben (und hast innerhalb der Prozedur auch nur die Member des Interfaces)
    4) Implements ist keine Vererbung sondern eine Implementiertung. Inherits ist Vererbung. Bei Vererbung übernehmen Klassen/Interfaces alle Member der Basis Klasse/Interface. Es gibt in .Net aber keine Mehrfachvererbung es ist jedoch möglich mehrere Interfaces zu implementier (Implements)
    5) Private -> Nur innerhalb der Klasse zugreifbar; Protected -> Innerhalb der Klasse und vererbten Klassen zugreifbar; Friend -> In allen Klassen der Assembly (deines Projektes) verfügbar; Public -> Überall zugreifbar. Wenn etwas als Shared (statisch) beschrieben wird, benöigt man keine Instanz sondenr kann direkt darauf zugreifen (Bsp.: System.Io.File Methoden)
    6) Du kannst eine Variable als Typ der Basisklasse deklareieren und eine Instanz einer Unterklasse erzeugen. Bsp.: Klasse A = Basis; Klasse B erbt von A

    VB.NET-Quellcode

    1. Dim c as A = New B

    umgekehrt funktioniert das aber nicht
    7) richtig
    8) Schöner sind Überladeungen mMn.
    9) Wüsste nicht wieso. Meistens kann man jedoch auf eine List(Of T) umsteigen.
    10) Wer bestimmt falsch oder richtig? Wenn es eine Private Klasse ist spricht mMn nichts dagegen. Ist es einen Eigenständige find ich es schöner diese auszulagern
    11) Mit MyBase rufst du die Methode der Basisklasse auf. Warum das aber bei UserControls so ist kann ich dir nicht sagen.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Zu 10.
    Es hat Sinn Klassen in Klassen zu erstellen. So kann man im Inneren z.B. mit irgendwelchen Template Wrappern arbeiten die von Außen nicht zugänglich sein sollen. Das gehört zur Kapselung, genauso wie die Public, Private und Protected Modifizierer. Kapselung ist zusammen mit Vererbung und Polymorphie das Grundprinzip der OOP. 3. Ist ein Beispiel für Polymorphie und Vererbung ist dir ja klar.

    Zur Polymorphie kannste dir sowas nochmal angucken Type Eraser. Ich hab letztens irgendwo den Unterschied zwischen statischer und dynamischer Polymorphie erklärt find den Post aber nicht mehr. Kommt mir das nur so vor oder kommen in letzter Zeit oft solche Fragen :huh: ?

    /Edit
    Habs doch gefunden ^^ Polymorphie
    DANKE !

    Zu 5.: Was ist mit den ganzen anderen Modifizierern (das Wort suche ich schon ewig) ? Friend zB.
    Zu 8.: Aber Optional fordert Constants, egal ?
    Zu 9.: Was sind Puffer ? ^^
    Zu 10.: Okay, aber mal zu meinem aktuellen Projekt, Minesweeper. Ich habe eine Klasse BombField, die ein Spielfeld beschreibt, und eine Klasse Sector, die ein feld eben beschreibt. Momentan ist die Klasse Sector IN BombField gecodet, damit man / ich halt immer "BombField.Sector" schreiben muss, zur Übersicht. Geht das auch anders oder ist das eh unnötig ?
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    ThePlexian schrieb:

    Zu 9.: Was sind Puffer ?
    Die Dinger, die Daten z.B. beim Kopieren von Streams zwischenspeichern (puffern).

    ThePlexian schrieb:

    Zu 5.: Was ist mit den ganzen anderen Modifizierern (das Wort suche ich schon ewig) ? Friend zB.

    Artentus schrieb:

    Friend heißt, man kann nur innerhalb des Projektes darauf zugreifen
    Mit freundlichen Grüßen,
    Thunderbolt
    Okay ich danke euch allen :) So wird mir einiges klarer :)

    Nur wenn ich so überlege, würde ich nie Interfaces verwenden, wenn ich selbst eine Anwendung erstelle.
    Bei ner dll vllt, aber nur ganz vielleicht. Worin genau liegt der Vorteil bei denen ? Und warum wurde bspw. IDisposable nicht als Class geschrieben, sodass eine Class von ihr erben kann, und bei Bedarf werden die Methoden von IDisposable einfach überschrieben ?
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais

    Gonger96 schrieb:

    Jo. Auch wenn man nun Mehrfachvererbung zur Verfügung hat, also wenn eine Klasse soviele Basisklassen haben kann wie sie will, nutzt man immernoch Interfaces.
    Und ich dachte, ich hätte neulich gelernt, in C++ gibts keine Interfaces, weil die Mehrfachvererbung hätten 8|
    Hat c++ doch Interfaces?

    ErfinderDesRades schrieb:

    Hat c++ doch Interfaces?

    Streng genommen nicht. Nicht dass ich wüsste. Nichtsdestotrotz lassen sich mit C++ COM-Klassen erzeugen, und die haben Interfaces, aber das wird in C++ dann eher über midl gelöst.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    @ErfinderDesRades
    Interfaces haben wir schon, nur die Deklaration erfolgt als Klasse. Es sind also eigentlich Klassen, deren Methoden alle virtuell sind und = 0.

    C-Quellcode

    1. class ITest
    2. {
    3. public:
    4. virtual void TestMethode() = 0;
    5. virtual ~ITest() {}; // Destruktor
    6. };

    Das wär n Interface in C++. Für Vererbung braucht man die aber fast nie, da kommt eher die Mehrfachvererbung zum Zug und man hat mehrere Basisklassen

    Gonger96 schrieb:

    Interfaces haben wir schon, nur die Deklaration erfolgt als Klasse.
    Na, sowas akzeptiere ich nicht, weil eine Vergewaltigung von Begrifflichkeit: "Interfaces haben wir nicht, aber haben wir doch, deklarieren sie aber als Klasse".

    Korrekt ist (scheint zu sein): c++ benötigt keine Interfaces, sondern dort ist das OOP-Erfordernis "Vertraglichkeit" durch Mehrfach-Vererbung mit abgedeckt.
    c++ tickt halt anners.