none
Kann mir jemand eine Aufgabe zur abstrakte und überladende Methoden geben? RRS feed

  • Frage

  • Hallo,kann mir jemand eine Aufgabe zur abstrakten und übergeladete Methoden in C# geben?

    Bitte nicht schwere Aufgaben geben fûr 12 Jährige denn ich bin gerade mal 12

    Danke

    Montag, 22. Dezember 2014 20:26

Antworten

  • Also sowie die Methode "Kosten()" aussieht eigentlich garnichts. Sie kann ja nichts machen.

    So ist eigentlich vom technischen her alles OK, nur Sinn macht es noch keinen.

    Versuche doch mal das so zu ändern, dass Kosten einen Wert zurück gibt vom Typ "double".

    Bei der Oper ist der Wert Einnahmen * Menschen (positiver Wert!), bei den Häusern Ausgaben * Menschen (negativer Wert). Oder war das anders herum? Hängt davon ab, von welcher Perspektive man es sieht.


    © 2015 Thomas Roskop

    Dienstag, 23. Dezember 2014 13:30
  • Schön, dass es auch jüngere gibt, die c# mögen. Die meisten Jugendlichen sitzen doch nur noch vorm PC und spieln oder machen Unfug - ich kenne meine Klassenkameraden ;)

    Eine Aufgabe:

    Wie wäre es, wenn du eine Klasse erschaffst, die ein allgemeine Gebäude darstellt. Mit verschiedenen Eingenschaften.

    Dieses Gebäude besitzt eine Methode, mit der die Kosten berechnet werden (Rückgabe als Double) / abstrakt.

    Dann gibt es zwei abgeleitete Klasse: ein Haus und die Oper.

    Die Oper kostet Geld (-), und das Haus gibt Geld (+). Beide Gebäude überladen deshalb die Methode zum Kostenberechnen und geben ihren Wert zurück.

    Als Parameter verlangt die Berechnenden Methode überigens die Anzahl der Personen (Dieser Parameter ist triviial, aber hat einen Zweck: Wenn es ihn nicht gäbe, dann würde man die Kosten als Eigenschaft setzten, du willst abe Methoden lernen :) )

    Wenn du hilfe brauchst, dann Frag nochmal nach. Die Lösung kann ich dir auch geben, wenn du Fertig bist.

    --- Sollte eine einfache Aufgabe sein.


    © 2015 Thomas Roskop

    Montag, 22. Dezember 2014 20:55
  • Eine Eigenschaft kann so nicht abstrahiert werden.

    Die Methode Kosten sollte doch als abstract definiert werden, damit du sie in der Haus-Klasse überschreiben kannst ;)

    Wenn dann muss es wie folgt heißen:

    public abstract int DeinWert { get; set; } //Eine Eigenschaft!! -> Property

    // Oder so vollständig: class B {
                public abstract int DeinWert { get; set; } //Eine Eigenschaft!! -> Property
            }

            class C : B {
                public override int DeinWert {
                    get {
                        throw new NotImplementedException ();
                    }
                    set {
                        throw new NotImplementedException ();
                    }
                }
            }


    © 2015 Thomas Roskop



    Dienstag, 23. Dezember 2014 13:02
  • Hier ist die Lösung, wie ich Sie gemacht hätte:

    public abstract class Gebäude {
    		public abstract double KostenBerechnen(); //Abstrakt verhindert einen Standartwert und zwingt eine Implementierung
    		public virtual double KostenProPerson { get { return 0; /* Standartwert: 0 */ } }
    		public virtual int PersonenMaximum { get { return 0; } }
    		//Virtual erlaubt einen Stanrtinhalt, in diesem falle: return 0;
    	}
    
    	public class Oper : Gebäude {
    		public override double KostenBerechnen ()
    		{
    			return (this.KostenProPerson * this.PersonenMaximum) * 1.19d; //19% Mehrwertstauer für den Staat ;)
    		}
    
    		public override double KostenProPerson {
    			get {
    				return +15.0d; //15€ Gewinn pro Person 
    			}
    		}
    
    		public override int PersonenMaximum {
    			get {
    				return 2000; //2000 Menschen
    			}
    		}
    	}
    
    	public class Haus : Gebäude {
    		public override double KostenBerechnen ()
    		{
    			return this.KostenProPerson * this.PersonenMaximum;
    		}
    
    		public override double KostenProPerson {
    			get {
    				return -5.0d; //5€ Kosten pro Person 
    			}
    		}
    
    		public override int PersonenMaximum {
    			get {
    				return 10; //10 Menschen pro Haus
    			}
    		}
    	}
    
    	public class TEST {
    		public static void Test() {
    			Gebäude d = new Oper ();
    			Console.WriteLine (d.KostenBerechnen ());
    		}
    	}


    © 2015 Thomas Roskop

    Mittwoch, 24. Dezember 2014 11:20

Alle Antworten

  • Schön, dass es auch jüngere gibt, die c# mögen. Die meisten Jugendlichen sitzen doch nur noch vorm PC und spieln oder machen Unfug - ich kenne meine Klassenkameraden ;)

    Eine Aufgabe:

    Wie wäre es, wenn du eine Klasse erschaffst, die ein allgemeine Gebäude darstellt. Mit verschiedenen Eingenschaften.

    Dieses Gebäude besitzt eine Methode, mit der die Kosten berechnet werden (Rückgabe als Double) / abstrakt.

    Dann gibt es zwei abgeleitete Klasse: ein Haus und die Oper.

    Die Oper kostet Geld (-), und das Haus gibt Geld (+). Beide Gebäude überladen deshalb die Methode zum Kostenberechnen und geben ihren Wert zurück.

    Als Parameter verlangt die Berechnenden Methode überigens die Anzahl der Personen (Dieser Parameter ist triviial, aber hat einen Zweck: Wenn es ihn nicht gäbe, dann würde man die Kosten als Eigenschaft setzten, du willst abe Methoden lernen :) )

    Wenn du hilfe brauchst, dann Frag nochmal nach. Die Lösung kann ich dir auch geben, wenn du Fertig bist.

    --- Sollte eine einfache Aufgabe sein.


    © 2015 Thomas Roskop

    Montag, 22. Dezember 2014 20:55
  • Hallo,
    es ist nicht gerade einfach eine Aufgabe zu finden, die  nur so spezielle Teile der Verwendung von OOP trainiert.

    Meiner Meinung nach wirst du es sowieso erst richtig beherrschen, wenn du richtig programmierst. Das heißt, wenn du echte Probleme versuchst zu lösen. Ich denke, das es sich mehr lohnen würde dir ein richtiges Projekt zu suchen und daran zu arbeiten. Es muss nichts großes sein, es reichen kleine Dinge mit denen man fast nur mit C# an sich zu tun hat.
    Mein Lieblingsbeispiel ist da immer einen Taschenrechner zu schreiben. Wobei "sin(12+3)*12+3/4" nicht einfach berechnet werden sollte, sondern zunächst in mehrere Klassen Instanzen zerlegt wird.

    Wenn du trotzdem etwas einfacheres haben willst, kannst du so ziemlich alles in Klassen umsetzen, was man Klassifizieren kann. Beispielsweise eine Stadt. Jede Stadt kann Häuser aufnehmen, wobei jedes Haus verschiedene Methoden und Eigenschaften wie VerbraucheStrom und GebeStrome oder auch IstAnAbwasserAngeschlossen hat. Große Häuser können u.U. auch mehrere solche Anschlüsse haben usw. Dadurch kannst du die Methoden ggf. überschreiben.
    Komplexer kannst du es noch machen, indem du das für die Städte wiederholst. Ein Dorf hat ein einziges Stromkabel, eine Großstadt mehrere Tausend die den Strom zuliefern.
    Damit das nicht nur ein Geschreibe von Klassen wird, kannst du ja auch eine Verwaltung drum herum bauen, wodurch du auch nochmal Dinge wie Fehlerbehandlung usw. üben würdest.


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Montag, 22. Dezember 2014 20:59
    Moderator
  • Hi wenn du Lust hast kannst du dir mal AntMe! anschauen. Wenn ich es richtig sehe gibt es dort eine abstrakte Klasse deren Methoden du überschreiben sollst.

    MFG

    Björn

    Dienstag, 23. Dezember 2014 01:40
  • Schön, dass es auch jüngere gibt, die c# mögen. Die meisten Jugendlichen sitzen doch nur noch vorm PC und spieln oder machen Unfug - ich kenne meine Klassenkameraden ;)

    Eine Aufgabe:

    Wie wäre es, wenn du eine Klasse erschaffst, die ein allgemeine Gebäude darstellt. Mit verschiedenen Eingenschaften.

    Dieses Gebäude besitzt eine Methode, mit der die Kosten berechnet werden (Rückgabe als Double) / abstrakt.

    Dann gibt es zwei abgeleitete Klasse: ein Haus und die Oper.

    Die Oper kostet Geld (-), und das Haus gibt Geld (+). Beide Gebäude überladen deshalb die Methode zum Kostenberechnen und geben ihren Wert zurück.

    Als Parameter verlangt die Berechnenden Methode überigens die Anzahl der Personen (Dieser Parameter ist triviial, aber hat einen Zweck: Wenn es ihn nicht gäbe, dann würde man die Kosten als Eigenschaft setzten, du willst abe Methoden lernen :) )

    Wenn du hilfe brauchst, dann Frag nochmal nach. Die Lösung kann ich dir auch geben, wenn du Fertig bist.

    --- Sollte eine einfache Aufgabe sein.


    © 2015 Thomas Roskop

    Ok ich werde es machen.

    Danke

    Dienstag, 23. Dezember 2014 12:23
  • Hallo,

    ich habe bis jetzt so viel gemacht:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication43
    {
        class Program
        {
            static void Main(string[] args)
            {
            }
        }
        public abstract class Gebäude {
            public int Wievieleleutedareinpassen;
            public string Farbe;
            public double GeldgebenfürHaus;
            public double GeldbenutzenfürOper;
            public abstract int AnzahlderPersonen;
            public int anzahlderpersonen {
                get { return AnzahlderPersonen; }
                set { AnzahlderPersonen = value; }
            }
            public void Kosten() {
    
            }
        }
        public class Haus : Gebäude {
    
        }
    }

    Bei Amzahlderpersonen steht:  

    The modifier 'abstract' is not valid on fields. Try using a property instead.

    Ich habe das gemacht was auf der Seite stand was zu machen ist:  http://msdn.microsoft.com/en-us/library/ck6szy45%28v=vs.90%29.aspx

    Können sie mir helfen was es damit meint

    Damit ich weitermachen kann?

    Danke

    Dienstag, 23. Dezember 2014 12:42
  • Eine Eigenschaft kann so nicht abstrahiert werden.

    Die Methode Kosten sollte doch als abstract definiert werden, damit du sie in der Haus-Klasse überschreiben kannst ;)

    Wenn dann muss es wie folgt heißen:

    public abstract int DeinWert { get; set; } //Eine Eigenschaft!! -> Property

    // Oder so vollständig: class B {
                public abstract int DeinWert { get; set; } //Eine Eigenschaft!! -> Property
            }

            class C : B {
                public override int DeinWert {
                    get {
                        throw new NotImplementedException ();
                    }
                    set {
                        throw new NotImplementedException ();
                    }
                }
            }


    © 2015 Thomas Roskop



    Dienstag, 23. Dezember 2014 13:02
  • Hallo,

    Bin gerade soweit gekommen:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication43
    {
        class Program
        {
            static void Main(string[] args)
            {
            }
        }
        public abstract class Gebäude {
            public int Wievieleleutedareinpassen;
            public string Farbe;
            public double AnfangsGeld;
            public  double GeldgebenfürHaus = 5000;
            public double GeldbenutzenfürOper = 2500;
            public int AnzahlderPersonen;
            public abstract void Kosten();
        }
        public class Haus : Gebäude {
            public override void Kosten() {
                
            }
        }
        public class Oper : Gebäude {
            public override void Kosten() {
                
            }
        }
    }

    Was sollte jetzt in die beiden Klammern kommen also bei den abgeleiteten Kosten()?

    Ich komme nicht mehr weiter.

    Können sie mir helfen?

    Danke.

    Dienstag, 23. Dezember 2014 13:27
  • Also sowie die Methode "Kosten()" aussieht eigentlich garnichts. Sie kann ja nichts machen.

    So ist eigentlich vom technischen her alles OK, nur Sinn macht es noch keinen.

    Versuche doch mal das so zu ändern, dass Kosten einen Wert zurück gibt vom Typ "double".

    Bei der Oper ist der Wert Einnahmen * Menschen (positiver Wert!), bei den Häusern Ausgaben * Menschen (negativer Wert). Oder war das anders herum? Hängt davon ab, von welcher Perspektive man es sieht.


    © 2015 Thomas Roskop

    Dienstag, 23. Dezember 2014 13:30
  • Hallo,

    Was ist der Fehler hier?

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication43
    {
        class Program
        {
            static void Main(string[] args)
            {
            }
        }
        public abstract class Gebäude
        {
            public int Wievieleleutedareinpassen;
            public string Farbe;
            public double AnfangsGeld;
            public double GeldgebenfürHaus = 5000;
            public double GeldbenutzenfürOper = 2500;
            public  virtual double einnahmenfürOper;
            public virtual int AnzahlderPersonen;
    
            public abstract void Kosten();
        }
        public class Haus : Gebäude
        {
            public override void Kosten()
            {
    
            }
        }
        public class Oper : Gebäude
        {
            public double Oper = einnahmenfürOper * 
            public override EinnahmenfürOper = einnahmenfürOper * AnzahlderPersonen;
            public override void Kosten()
            {
    
            }
        }
    }
    

    Ich bin gerade hier da wo public override EinnahmenfürOper = einnahmenfürOper * AnzahlderPersonen;

    Können sie mir helfen damit ich weiter machen kann?

    Danke

    Mittwoch, 24. Dezember 2014 10:38
  • Nett wäre es, wenn du die genaue Fehlermeldung von Visual Studio mit reinkopierst, so muss man immer den Code selbst kompilieren :)

    1. Fehler: die Werte "einnahmenfürOper" und "AnzahlderPersonen" können nicht Virtuell sein, dass geht nur bei Eigenschaften.

    public int AnzahlDerPersonen { get; set; } //Eigenschaft
    // - Oder -
    public int AnzahlDerPersonen { get; set; }
    //... Aber NICHT 
    public int AnzahlDerPersonen; //Offene Variable

    2. Fehler: Du hast eine Variable genau so genannt wie die drumherumliegende Klasse (-> Oper), das geht nicht, ist leider nicht erlaubt.

    3. Fehler: Da du wie in 1. beschrieben keine Virtuellen Variablen erstellen kannst, klannst du diese auch nicht überladen.

    Wenn ich aber ehrlich bin, dann sind das Fehler, die der Compiler sehr gut bennent:

    .../Program.cs(108,26): error CS0106: The modifier `virtual' is not valid for this item
    .../Program.cs(109,22): error CS0106: The modifier `virtual' is not valid for this item
    .../Program.cs(122,17): error CS0542: `ROSKOP.Internal.TestModule.Oper.Oper': member names cannot be the same as their enclosing type
    .../Program.cs(120,15): (Location of the symbol related to previous error)
    .../Program.cs(123,3): error CS1525: Unexpected symbol `public'

    Der Compiler gibt sogar die Zeile und die Position ein. Im Vergleich zu so manchen c++ Fehlern, ist das gerade zu die Lösung auf dem Silbertablett

    Und Visual Studio gibt sogar die deutsche Fehlermeldung aus, habe gerade nur MonoDevelop zur Verfügung, aber verstehen kann man es ja trotzdem ;)


    © 2015 Thomas Roskop


    • Bearbeitet Thomas Roskop Mittwoch, 24. Dezember 2014 10:50 Anmerkung
    Mittwoch, 24. Dezember 2014 10:48
  • Hallo,

    ich komme nicht weiter:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApplication43
    {
        class Program
        {
            static void Main(string[] args)
            {
            }
        }
        public abstract class Gebäude
        {
            public int Wievieleleutedareinpassen;
            public string Farbe;
            public double AnfangsGeld;
            public double GeldgebenfürHaus = 5000;
            public double GeldbenutzenfürOper = 2500;
            public  virtual double einnahmenfürOper;
            public virtual int AnzahlderPersonen;
    
            public abstract void Kosten();
        }
        public class Haus : Gebäude
        {
            public override void Kosten()
            {
    
            }
        }
        public class Oper : Gebäude
        {
    
            
            public override void Kosten()
            {
    
            }
        }
    }

    Können sie mir die Lösung geben?

    Danke

    Mittwoch, 24. Dezember 2014 10:55
  • Hier ist die Lösung, wie ich Sie gemacht hätte:

    public abstract class Gebäude {
    		public abstract double KostenBerechnen(); //Abstrakt verhindert einen Standartwert und zwingt eine Implementierung
    		public virtual double KostenProPerson { get { return 0; /* Standartwert: 0 */ } }
    		public virtual int PersonenMaximum { get { return 0; } }
    		//Virtual erlaubt einen Stanrtinhalt, in diesem falle: return 0;
    	}
    
    	public class Oper : Gebäude {
    		public override double KostenBerechnen ()
    		{
    			return (this.KostenProPerson * this.PersonenMaximum) * 1.19d; //19% Mehrwertstauer für den Staat ;)
    		}
    
    		public override double KostenProPerson {
    			get {
    				return +15.0d; //15€ Gewinn pro Person 
    			}
    		}
    
    		public override int PersonenMaximum {
    			get {
    				return 2000; //2000 Menschen
    			}
    		}
    	}
    
    	public class Haus : Gebäude {
    		public override double KostenBerechnen ()
    		{
    			return this.KostenProPerson * this.PersonenMaximum;
    		}
    
    		public override double KostenProPerson {
    			get {
    				return -5.0d; //5€ Kosten pro Person 
    			}
    		}
    
    		public override int PersonenMaximum {
    			get {
    				return 10; //10 Menschen pro Haus
    			}
    		}
    	}
    
    	public class TEST {
    		public static void Test() {
    			Gebäude d = new Oper ();
    			Console.WriteLine (d.KostenBerechnen ());
    		}
    	}


    © 2015 Thomas Roskop

    Mittwoch, 24. Dezember 2014 11:20