C# virtual und abstract

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • C# virtual und abstract

    Hallo zusammen!

    Ich bin ein absoluter Newbie in der Programmierung und bereite mich gerade auf eine Klausur in AW vor.
    Jetzt habe ich hier einen Code-Ausschnitt vorliegen und einige Fragen dazu.

    Quellcode

    1. interface IWare{
    2. String getName();
    3. float getPreis();
    4. }
    5. abstract class Kunde{
    6. private IWare bestellung;
    7. public void bestellen(IWare ware){
    8. bestellung = ware;
    9. }
    10. public virtual String rechnung(){
    11. return "Sie erhalten " + bestellung.getName() + " zum Preis von " + bestellung.getPreis().ToString();
    12. }
    13. public abstract void lieferzeit(DateTime zeit);
    14. }
    15. class Stammkunde : Kunde{
    16. public String name;
    17. public String vorname;
    18. }
    19. class Laufkunde : Kunde{
    20. }
    Alles anzeigen

    Was ist der Unterschied zwischen virtual und abstract? Muss man da etwas bestimmtes beachten?
    Was bedeutet es wenn eine Methode weder abstract noch virtual ist?

    Hier noch eine Frage meines Lehrers auf die ich keine Antwort weiß:
    Welche Wirkung hat es, dass die Methode "bestellen" weder virtual noch abstract ist? Ist das sinnvoll?

    Natürlich möchte ich nicht dass ihr meine Aufgaben erledigt, allerdings wäre ich für eine kleine Hilfestellung sehr dankbar. :)
  • Abstract-Keyword: msdn.microsoft.com/en-us/library/sf985hc5(v=vs.71).aspx
    Virtual-Keyword: msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.80).aspx

    Abstrakte Methoden enthalten keine Funktion, sind also quasi Vorlagen, welche Funktionen in erbenden Klassen vorhanden sein müssen.
    Virtuelle Methoden sind Methoden, die in erbenden Klassen überschrieben werden können, aber nicht müssen.

    Methoden, die weder abstrakt, noch virtuell sind, können nicht überschrieben werden.
    Jan Thurau
    Software and Systems Engineer
    janthurau.de

    [Blockierte Grafik: http://www.pageheroes.com/media/image/pageheroes_logo.png] - We get your page working!
  • "Stammkunde" und "Laufkunde" erben in meinem Fall ja von "Kunde".
    Also würde ich das Programm richtig mit Leben füllen, müsste ich in "Stammkunde" (oder/und "Laufkunde") sagen was getan werden soll und "Kunde" so lassen wie es da jetzt steht. Korrekt?

    Aber was hat es zu bedeuten, wenn weder virtual noch abstract angegeben ist?
    Bei meiner Googlesuche bin ich außerdem auf sealed gestoßen, wozu benötigt man denn das? ?(
  • Also ich kenne C# eigentlich nicht, habe nur kurz Google bedient. Daher alles ohne Gewähr, habe ich nur so aus dem msdn entnommen.

    Aber da Kunde eine abstrakte Klasse ist, kann diese nicht ohne weiteres instanziert werden.
    Du müsstest also Stammkunde und Laufkunde sagen, was die Methode lieferzeit macht.
    Die Methode rechnung *kannst* du in Stammkunde und Laufkunde überschreiben, musst du aber nicht.

    Eine non-virtual Methode kann *nicht* überschrieben werden.

    Sealed: "An overriding property declaration may include the sealed modifier. Use of this modifier prevents a derived class from further overriding the property. The accessors of a sealed property are also sealed."

    Hier steht sonst weiteres: msdn.microsoft.com/en-us/library/aa664453(v=vs.71).aspx
    Jan Thurau
    Software and Systems Engineer
    janthurau.de

    [Blockierte Grafik: http://www.pageheroes.com/media/image/pageheroes_logo.png] - We get your page working!
  • Okay, erst ein mal vielen Dank für deine Hilfe. :)

    Warum hast du
    kann *nicht* überschrieben werden
    in Sternchen gepackt?

    Und:
    Also können "Stammkunde" und "Laufkunde" die Methode "bestellen" nur so aufrufen wie sie in "Kunde" vorgegeben ist und die Methode kann nicht überschrieben werden?
    Macht es also Sinn, die Mehtode weder abstract noch virtual zu deklarieren, weil für den Bestellvorgang egal ist ob es ein Stammkunde oder ein Laufkunde ist. Korrekt? :S
  • Das Sternchen ist nur zur Hervorhebung.

    Richtig, die Methode bestellen ist nicht überschreibbar, kann also nur so aufgerufen werden, wie sie in Kunde definiert wird.
    Ich würde die Methode bestellen auch aus dem von dir genannten Grund nicht überschreibbar machen. Die Bestellung interessiert es ja nicht, ob sie von einem Stamm- oder Laufkunden ausgelöst wird.
    Jan Thurau
    Software and Systems Engineer
    janthurau.de

    [Blockierte Grafik: http://www.pageheroes.com/media/image/pageheroes_logo.png] - We get your page working!
  • Programmieren ist learning by doing. Theorie ist schön und das Internet bietet viel zu lesen.
    Schaust du dir 10 Seite an, bekommst du mit Sicherheit 10 verschiedene Erklärungen, wovon mindestens eine dabei ist, an der du das Thema verstehst. Guckst du dir aber eine 11. Erklärung an, kann es schnell sein, dass du von 100 auf 0, alles verstandene in Frage stellst.
    Konsequenz: Frustriert und kein Bock mehr.

    Abhilfe? Ausprobieren ;) !

    Jag erstmal dein Codeausschnitt durch den Compiler und schau dir die Fehlermeldungen an und bring dein Beispiel zum laufen. (Mainklasse mit Instanzierung(en) musst du selbst implementieren, logisch ?! )
    Wenn das funktioniert, hast du eine wunderbare Basis all deine Fragen (auf neu aufkommenden Fragen) durch testen zu lösen.

    Was ist der Unterschied zwischen virtual und abstract? Muss man da etwas bestimmtes beachten?

    Nimm die Bezeichner in deinem Beispiel heraus bzw. füg sie ein und schau dir die Fehlermeldungen / guck was passiert.

    Was bedeutet es wenn eine Methode weder abstract noch virtual ist?

    Alle Bezeichner entfernen.

    Welche Wirkung hat es, dass die Methode "bestellen" weder virtual noch abstract ist? Ist das sinnvoll?

    Überlegen, ob es gut ist, dass beim Stamm- oder Laufkunde immer derselbe Bestellvorgang genutzt wird.