Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Abstrakte Klasse
Irina
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

Abstrakte Klasse

beantworten | zitieren | melden

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

Moderationshinweis von Abt (17.09.2021 - 09:33)

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

private Nachricht | Beiträge des Benutzers
glandorf
myCSharp.de - Member

Avatar #avatar-4144.jpg


Dabei seit:
Beiträge: 84
Herkunft: Chemnitz

beantworten | zitieren | melden

Hallo,

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

glandorf
private Nachricht | Beiträge des Benutzers
Irina
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

beantworten | zitieren | melden

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)
{
}
}
}
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.504

beantworten | zitieren | melden

Bitte formatiere deinen Code (so wie ein Moderator es bereits bei deinem ersten Code gemacht hat), dann wird dir hier auch geholfen.
private Nachricht | Beiträge des Benutzers
Irina
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

beantworten | zitieren | melden


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)
{
}
}
} 
private Nachricht | Beiträge des Benutzers
Irina
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

beantworten | zitieren | melden

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.....
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.504

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Papst
myCSharp.de - Experte



Dabei seit:
Beiträge: 430
Herkunft: Kassel

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Irina
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
OlafSt
myCSharp.de - Member



Dabei seit:
Beiträge: 79
Herkunft: HH

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von OlafSt am .
private Nachricht | Beiträge des Benutzers
Irina
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

beantworten | zitieren | melden

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.....
private Nachricht | Beiträge des Benutzers
Irina
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

beantworten | zitieren | melden

Die Konsolenausgabe funktioniert nicht, sie ist komplett rot unterkringelt....
Auch oben in der Klasse Program ist das new Quadrat rot unterkringelt....
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Irina am .
private Nachricht | Beiträge des Benutzers
Th69
myCSharp.de - Experte

Avatar #avatar-2578.jpg


Dabei seit:
Beiträge: 4.504

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Irina
myCSharp.de - Member



Dabei seit:
Beiträge: 20

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
ClaraSoft
myCSharp.de - Member



Dabei seit:
Beiträge: 54

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
inflames2k
myCSharp.de - Experte

Avatar #AARsmmPEUMee0tQa2JoB.png


Dabei seit:
Beiträge: 2.296

beantworten | zitieren | melden

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 | Spielkartenbibliothek
private Nachricht | Beiträge des Benutzers