Laden...

Abstrakte Klasse

Erstellt von Irina vor 2 Jahren Letzter Beitrag vor 2 Jahren 608 Views
I
Irina Themenstarter:in
20 Beiträge seit 2021
vor 2 Jahren
Abstrakte Klasse

Hallo zusammen,

bin gerade mit einer Aufgabe beschäftigt, wo ich gerade nicht weiter weiß. 😭
In der Aufgabe geht es darum, das eine abstrakte Klasse mit dem Namen Figur erstellt werden soll, gefolgt von den Unterklassen Rechteck und Quadrat.
Die abstrakte Basisklasse Figur soll zwei abstrakte Methoden Umfang und Fläche deklarieren. Die Methoden geben nichts zurück, da sie lediglich eine Konsolenausgabe bewirken soll. Von der Klasse Figur erben zwei Klassen Rechteck und Quadrat. Die Berechnungsergebnisse sollen auf der Konsole ausgegeben werden.
Bis jetzt sieht mein geschriebener Code gut aus, bis auf die Meldung, das als Einstiegspunkt keine statische Main Methode vorhanden ist. Irgendwie stehe ich gerade vor einer Wand. Vielleicht hat jemand eine Idee wo mein Denkfehler ist. 🙂


abstract class Figur
    {
        public int breite, hoehe;
        public Figur() { }
        public Figur(int breite, int hoehe)
        {
            this.breite = breite;
            this.hoehe = hoehe;
        }
        public abstract void Umfang(int cm);
        public abstract void Fläche(int cm);

        static void Main(string[] args)
        {
            
        }
    }
    class Rechteck : Figur
    {
        public Rechteck() { }
        public override void Umfang(int cm)
        {
            int breite = 6;
            int hoehe = 4;
            Console.WriteLine("Umfang des Rechtecks: " + 2 * (breite + hoehe) + cm);
        }
        public override void Fläche(int cm)
        {
            int breite = 10;
            int hoehe = 6;
            Console.WriteLine("Fläche des Rechtecks: " + breite * hoehe + cm);
        }
    }
    class Quadrat : Rechteck
    {
        public Quadrat() { }
        public override void Umfang(int cm)
        {
            int breite = 22;
            Console.WriteLine("Umfang des Quadrats: " + 4 * breite + cm);
        }
        public override void Fläche(int cm)
        {
            int breite = 45;
            Console.WriteLine("Fläche des Quadrats: " + breite * breite + cm);
        }
    }
}
 

LG Irina

Hinweis von Abt vor 2 Jahren

Bitte beachte in Zukunft [Hinweis] Wie poste ich richtig?, darunter Titel und Code Formatierung.
Niemand will Plaintext Code lesen.

87 Beiträge seit 2016
vor 2 Jahren

Hallo,

deine Main-Methode ist in der abstrakten Klasse. Da gehört sie nicht hin.

glandorf

I
Irina Themenstarter:in
20 Beiträge seit 2021
vor 2 Jahren

Hallo,

ok, ich habe dies unten unter der Klasse Program angehangen. Ist das so in Ordnung oder kann ich die Main Methode auch in der Klasse Rechteck einfügen?
Wie bzw. was definiere ich jetzt in der Main Methode?
Ist in diesem Fall

Rechteck rechteck = new Rechteck();
Quadrat quadrat = new Quadrat();

richtig?
Habe das gerade probiert, die Konsole lässt sich problemlos starten, aber es sind keine Werte vorhanden.
Muss ich die Berechnung in die Main Methode einfügen und aus Console.WriteLine entfernen?

abstract class Figur   
{  
    public int breite, hoehe;  
    public Figur() { }  
    public Figur(int breite, int hoehe)  
    {  
        this.breite = breite;  
        this.hoehe = hoehe;  
    }  
    public abstract void Umfang(int cm);  
    public abstract void Fläche(int cm);  
}  
class Rechteck : Figur  
{  
    public Rechteck() { }  
    public override void Umfang(int cm)  
    {  
        int breite = 6;  
        int hoehe = 4;  
        Console.WriteLine("Umfang des Rechtecks: " + 2 * (breite + hoehe) + cm);  
    }  
    public override void Fläche(int cm)  
    {  
        int breite = 10;  
        int hoehe = 6;  
        Console.WriteLine("Fläche des Rechtecks: " + breite * hoehe + cm);  
    }  
}  
class Quadrat : Rechteck  
{  
    public Quadrat() { }  
    public override void Umfang(int cm)  
    {  
        int breite = 22;  
        Console.WriteLine("Umfang des Quadrats: " + 4 * breite + cm);  
    }  
    public override void Fläche(int cm)  
    {  
        int breite = 45;  
        Console.WriteLine("Fläche des Quadrats: " + breite * breite + cm);  
    }  
}  
class Program  
{  
    static void Main(string[] args)  
    {  
    }  
}  

}

4.931 Beiträge seit 2008
vor 2 Jahren

Bitte formatiere deinen Code (so wie ein Moderator es bereits bei deinem ersten Code gemacht hat), dann wird dir hier auch geholfen.

I
Irina Themenstarter:in
20 Beiträge seit 2021
vor 2 Jahren

abstract class Figur
{
public int breite, hoehe;
public Figur() { }
public Figur(int breite, int hoehe)
{
this.breite = breite;
this.hoehe = hoehe;
}
public abstract void Umfang(int cm);
public abstract void Fläche(int cm);
}
class Rechteck : Figur
{
public Rechteck() { }
public override void Umfang(int cm)
{
int breite = 6;
int hoehe = 4;
Console.WriteLine("Umfang des Rechtecks: " + 2 * (breite + hoehe) + cm);
}
public override void Fläche(int cm)
{
int breite = 10;
int hoehe = 6;
Console.WriteLine("Fläche des Rechtecks: " + breite * hoehe + cm);
}
}
class Quadrat : Rechteck
{
public Quadrat() { }
public override void Umfang(int cm)
{
int breite = 22;
Console.WriteLine("Umfang des Quadrats: " + 4 * breite + cm);
}
public override void Fläche(int cm)
{
int breite = 45;
Console.WriteLine("Fläche des Quadrats: " + breite * breite + cm);
}
}
class Program
{
static void Main(string[] args)
{
}
}
} 

I
Irina Themenstarter:in
20 Beiträge seit 2021
vor 2 Jahren

Test, Test, Test, Test


abstract class Figur
    {
        public int breite, hoehe;
        public Figur() { }
        public Figur(int breite, int hoehe)
        {
            this.breite = breite;
            this.hoehe = hoehe;
        }
        public abstract void Umfang(int cm);
        public abstract void Fläche(int cm);

        static void Main(string[] args)
        {

        }
    }
    class Rechteck : Figur
    {
        public Rechteck() { }
        public override void Umfang(int cm)
        {
            int breite = 6;
            int hoehe = 4;
            Console.WriteLine("Umfang des Rechtecks: " + 2 * (breite + hoehe) + cm);
        }
        public override void Fläche(int cm)
        {
            int breite = 10;
            int hoehe = 6;
            Console.WriteLine("Fläche des Rechtecks: " + breite * hoehe + cm);
        }
    }
    class Quadrat : Rechteck
    {
        public Quadrat() { }
        public override void Umfang(int cm)
        {
            int breite = 22;
            Console.WriteLine("Umfang des Quadrats: " + 4 * breite + cm);
        }
        public override void Fläche(int cm)
        {
            int breite = 45;
            Console.WriteLine("Fläche des Quadrats: " + breite * breite + cm);
        }
    }
    class Program
    {
           static void Main(string[] args)
    }
}    

Nochmal der vollständige Code in richtiger Formation.....

4.931 Beiträge seit 2008
vor 2 Jahren

OK, so doch viel leserlicher.

Ja, du mußt Objekte der Klassen erstellen und dann auch deren Methoden (Umfang, Fläche) aufrufen.

Kennst du schon Arrays oder Listen (List<T>)? Denn der Sinn von abstrakten Klassen besteht darin, deren Methoden aufzurufen ohne den genauen Klassentyp zu kennen.
Wenn man diese Objekte in ein Array oder Liste packt, so kann man dann deren abstrakten (bzw. virtuellen) Methoden in einer Schleife aufrufen und es wird jeweils die zu dem Objekt gehörende überschriebene Methode aufgerufen.

PS: Du kannst deine Beiträge auch noch (eine bestimmte Zeit lang) nacheditieren.

P
441 Beiträge seit 2014
vor 2 Jahren

Wenn du lediglich die Deklaration der Klassen nutzt.


Rechteck rechteck = new Rechteck();
Quadrat quadrat = new Quadrat();


Dann wird kein Code außer der ausgewählte Konstruktor ausgeführt.
Wenn du die Berechnungen sehen willst musst du die passenden Methoden aufrufen:


quadrat.Umfang();

Ruhe dir selber einen Gefallen und verwende keine Umlaute bei Bezeichnern (Fläche).
In der Regel verwendet man englische Bezeichner, es ist einfacher, sich das gleich von Anfang an anzugewöhnen.

I
Irina Themenstarter:in
20 Beiträge seit 2021
vor 2 Jahren

Hallo zusammen,

habe den Code aufgrund eurer Informationen geändert und einiges hinzugefügt und es funktioniert endliche.
Vielen Dank für eure Hilfe.

Der Code sieht jetzt so aus:


public class Program
    {
        static void Main(string[] args)
        {
            Rechteck a = new Rechteck(10, 5);
            Quadrat b = new Quadrat(5);

            a.Umfang();
            a.Flaeche();

            b.Umfang();
            b.Flaeche();
        }
    }

    public abstract class Figur
    {
        public int Breite;
        public int Hoehe;

        public Figur() { }

        public Figur(int breite, int hoehe)
        {
            this.Breite = breite;
            this.Hoehe = hoehe;
        }

        public abstract void Umfang();
        public abstract void Flaeche();
    }

    public class Rechteck : Figur
    {
        public Rechteck(int breite, int hoehe) : base(breite, hoehe) { }

        public override void Umfang()
        {
            Console.WriteLine("Umfang des Rechtecks: " + 2 * (this.Breite + this.Hoehe));
        }

        public override void Flaeche()
        {
            Console.WriteLine("Fläche des Rechtecks: " + this.Breite * this.Hoehe);
        }
    }

    public class Quadrat : Figur
    {
        public Quadrat(int laenge) : base(laenge, laenge) { }

        public override void Umfang()
        {
            Console.WriteLine("Umfang des Quadrats: " + 4 * this.Breite);
        }

        public override void Flaeche()
        {
            Console.WriteLine("Fläche des Quadrats: " + this.Breite * this.Breite);
        }
    }
}

Das war jetzt auch Sinn und Zweck der Aufgabe.

Mit den englischen Wörtern kenne ich aus der VBA/SQL Programmierung und wurde hier bei dem Thema C# noch nicht erwähnt.
Allerdings ist es erst das erste Buch zu diesem Thema und es folgen noch 4 weitere Bücher.

LG Irina

O
79 Beiträge seit 2011
vor 2 Jahren

Kirsche auf dem Sahnehäubchen wäre es gewesen, das Quadrat vom Rechteck abzuleiten. Dann hättest nur noch den Konstruktor überschrieben - alle anderen Methoden bräuchten dann kein override 😉

I
Irina Themenstarter:in
20 Beiträge seit 2021
vor 2 Jahren

Versuche gerade die Kirsche auf das Sahnehäubchen zu bekommen, aber hier erhalte ich einige Fehlermeldungen...


public class Program
    {
        static void Main(string[] args)
        {
            Rechteck a = new Rechteck(10, 5);
            Quadrat b = new Quadrat(5);

            a.Umfang();
            a.Flaeche();

            b.Umfang();
            b.Flaeche();
        }
    }

    public abstract class Figur
    {
        public int Breite;
        public int Hoehe;

        public Figur() { }

        public Figur(int breite, int hoehe)
        {
            this.Breite = breite;
            this.Hoehe = hoehe;
        }

        public abstract void Umfang();
        public abstract void Flaeche();
    }

    public class Rechteck : Figur
    {
        public Rechteck(int breite, int hoehe) : base(breite, hoehe) { }

        public override void Umfang()
        {
            Console.WriteLine("Umfang des Rechtecks: " + 2 * (this.Breite + this.Hoehe));
        }

        public override void Flaeche()
        {
            Console.WriteLine("Fläche des Rechtecks: " + this.Breite * this.Hoehe);
        }
    }

    public class Quadrat : Rechteck
    {
        public Quadrat(int breite, int hoehe) : base(breite, hoehe) { }
        {
            Console.WriteLine("Umfang des Quadrats: " + 4 * this.Breite);
            Console.WriteLine("Fläche des Quadrats: " + this.Breite* this.Breite);
        }
    }
}

Das Quadrat erbt noch nicht von der Klasse Rechteck.....

I
Irina Themenstarter:in
20 Beiträge seit 2021
vor 2 Jahren

Die Konsolenausgabe funktioniert nicht, sie ist komplett rot unterkringelt....
Auch oben in der Klasse Program ist das new Quadrat rot unterkringelt....

4.931 Beiträge seit 2008
vor 2 Jahren

Du solltest die Fehlermeldungen lesen und verstehen, s.a. [Hinweis] Syntaxfehler selbst lösen (Compilerfehlermeldungen).

Hast du using System; gelöscht?

Und dein Quadrat-Konstruktor sollte nur einen Parameter haben.
Außerdem lösche die Konsolenausgaben dort (durch die Ableitung von Rechteck sollen ja die Ausgaben durch dessen Methoden erfolgen - außer dass dann "Recthteck", statt "Quadrat", ausgegeben wird).

Zusatzaufgabe: Vergleiche "Breite" und "Höhe" und gib entsprechend "Rechteck" oder "Quadrat" aus.

PS: Für eine Hausaufgabe so OK, aber falls es dich interessiert, lies mal Kreis-Ellipse-Problem.

I
Irina Themenstarter:in
20 Beiträge seit 2021
vor 2 Jahren

Guten Morgen zusammen,

erstmal vielen Dank für die zahlreichen Informationen und die tolle Hilfe.
Lt. Aufgbe sollten Rechteck und Quadrat von Figur erben, deshalb gab es keine Kirsche auf das Sahnehäubchen.
Rechteck und Quadrat sollten zudem jeweils eine Konstruktormethode erhalten.
Ich habe eine mögliche Lösung gefunden und für die gesamte Einsendeaufgabe habe ich die Note 1 erhalten 🙂


public class Program
    {
        static void Main(string[] args)
        {
            Rechteck a = new Rechteck(10, 5);
            Quadrat b = new Quadrat(5);

            a.Umfang();
            a.Flaeche();

            b.Umfang();
            b.Flaeche();
        }
    }

    public abstract class Figur
    {
        public int breite;
        public int hoehe;

        public Figur() { }

        public Figur(int breite, int hoehe)
        {
            this.breite = breite;
            this.hoehe = hoehe;
        }

        public abstract void Umfang();
        public abstract void Flaeche();
    }

    class Rechteck : Figur
    {
        public Rechteck(int breite, int hoehe) : base(breite, hoehe) { }

        public override void Umfang()
        {
            Console.WriteLine("Umfang des Rechtecks: " + 2 * (breite + hoehe));
        }

        public override void Flaeche()
        {
            Console.WriteLine("Fläche des Rechtecks: " + breite * hoehe);
        }
    }

    class Quadrat : Figur
    {
        public Quadrat(int breite) : base(breite, breite) { }

        public override void Umfang()
        {
            Console.WriteLine("Umfang des Quadrats: " + 4 * breite);
        }

        public override void Flaeche()
        {
            Console.WriteLine("Fläche des Quadrats: " + breite * breite);
        }
    }
}

LG Irina

C
55 Beiträge seit 2020
vor 2 Jahren

Guten morgen

Sowas hört man gern. Trotzdem habe ich noch etwas anzumerken und zwar:


static void Main(string[] args)
        {
            Rechteck a = new Rechteck(10, 5);
            Quadrat b = new Quadrat(5);

            a.Umfang();
            a.Flaeche();

            b.Umfang();
            b.Flaeche();
        }

ist zwar in Ordnung aber hier solltest du deine Basisklasse Figur benutzen. Also statt "Rechteck a = new Rechteck(10, 5)", "Figur a = new Rechteck(10, 5)". Nachdem du Umfang und Flaeche den Rechtecks errechnet hast, kannst du a dann zu einem Quadrat machen mit "a = new Quadrat(5)". Alternativ könntest du auch mit einer Liste arbeiten.

Wenn du das gemacht hast sollte dir eigentlich ein Licht aufgehen.

2.298 Beiträge seit 2010
vor 2 Jahren

Hallo ClaraSoft,

der Hinweis ist zwar gut. Aber: An dieser Stelle ist es nicht erforderlich den Basistyp zu verwenden. Und an Stellen, wo ohnehin der Konkrete Typ bekannt ist kann und sollte der verwendet werden.

Erst wenn es komplexer wird und die konkreten Typen nicht mehr bekannt sind, sollte und muss man auf die Basisklasse zurück greifen. Hier absolut nicht erforderlich.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |