[C#] Preoblem ze static i wywolaniem metod

0

Mam problem z kilkoma rzeczami. Napisalem program (kod ponizej) z klasami punkt odcinek prostokat kolo
kazda po kolei dziedziczy z poprzednich i zawiera metody odpowiednie dla obiektu typu oblicz pole.
Gdy probuje wywolac ktoras z metod wyskakuje mi blad

Error 1 An object reference is required for the non-static field, method, or property 'ConsoleApplication3.Prostokat.obwodPr()' 153 13 ConsoleApplication3

Error 2 An object reference is required for the non-static field, method, or property 'ConsoleApplication3.Odcinek.szerokosc()' 154 13 ConsoleApplication3

taki sam blad wyskakiwal przy podawaniu wspolrzednych
zanim utworzylem po raz 2 obiekty (punkty A B C D)

bylbym wdzieczny gdyby ktos wyjasnil mi o co chodzi w tych bledach

 
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication3
{
   
   public class ObiektGraficzny
    {


    }
   public class Punkt : ObiektGraficzny
   {
       public double x, y;


       public Punkt()                           // konstruktor domyslny
       {
          // x1 = a1;
         //  y1 = b2;

       }
   }



   public class Odcinek : Punkt
    {

       public Punkt A = new Punkt();            // agregacje - 
       public Punkt B = new Punkt();            // odcinek zawiera 2 obiekty typu punkt

       public double szerokosc()                // metoda szerokosc liczy dlugosc odcinka ze wzoru 
        {
            double d1;

            d1 = Math.Sqrt(((B.x - A.x) * (B.x - A.x)) + ((B.y - A.y) * (B.y - A.y)));

            return d1;

        }

    }
   public class Prostokat : Odcinek      // klasa Prostokat dziedziczy punkty A i B
    {
       public Punkt C = new Punkt();       // dodane 2 punkty C i D tworza prostokat
       public Punkt D = new Punkt();       // z punktami A i B

        public double wysokosc()
        {
            double d2;

            d2 = Math.Sqrt(((D.x - A.x) * (D.x - A.x)) + ((D.y - A.y) * (D.y - A.y)));
            return d2;
        }

        public double obwodPr()
        {
            double obwodPr;

            obwodPr = 2 * szerokosc() + 2 * wysokosc();
            return obwodPr;
 

        }
        public double PolePr()
        {
            double pole1;

            pole1 = szerokosc() * wysokosc();
            return pole1;
            
        }


    }
   public class Okrag : Odcinek
    {
       public double ObwodK()
       {
           double obwodK;

           obwodK = 2 * Math.PI * szerokosc();
           return obwodK;
       }

       public double PoleK()
       {
           double PoleKo;

           PoleKo = Math.PI * szerokosc() * szerokosc();
           return PoleKo;
       }


    }

    class Program : Prostokat
    {

        public void przesun(double dx, double dy)
        {
            
            Console.WriteLine("Podaj wspolrzedna x wektora przesuniecia");
            dx = Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("Podaj wspolrzedna y wektora przesuniecia");
            dy = Convert.ToInt32(Console.ReadLine());

            Console.WriteLine("Wektor przesuniecia [{0},{1}]", dx, dy);

            A.x += dx;
            B.x += dx;
            C.x += dx;
            D.x += dx;
            A.y += dy;
            B.y += dy;
            C.y += dy;
            D.y += dy;

        }
        
        static void Main(string[] args)
        {
            Punkt A = new Punkt();
            Punkt B = new Punkt();
            Punkt C = new Punkt();
            Punkt D = new Punkt();

            Console.WriteLine("Podaj współrzedne punktu A");
            Console.Write("x :");
            A.x = Double.Parse(Console.ReadLine());
            Console.Write("y :");
            A.y = Double.Parse(Console.ReadLine());
            Console.WriteLine("Podaj współrzedne punktu B");
            Console.Write("x :");
            B.x = Double.Parse(Console.ReadLine());
            Console.Write("y :");
            B.y = Double.Parse(Console.ReadLine());
            Console.WriteLine("Podaj współrzedne punktu C");
            Console.Write("x :");
            C.x = Double.Parse(Console.ReadLine());
            Console.Write("y :");
            C.y = Double.Parse(Console.ReadLine());
            Console.WriteLine("Podaj współrzedne punktu D");
            Console.Write("x :");
            D.x = Double.Parse(Console.ReadLine());
            Console.Write("y :");
            D.y = Double.Parse(Console.ReadLine());

            szerokosc();
            obwodPr();
            Console.Read();
            

            
           


        }
    }
    


}
2

class Program : Prostokat

czy program jest rodzajem, lub szczególnym przypadkiem prostokąta?
czy program można traktować jako prostokąt?

2

Ogólnie cały ten kod jest do wywalenia.
Hierarchia klas jest do niczego: od kiedy to okrąg czy prostokąt jest szczególnym przypadkiem odcinka?
Błąd mówi jasno, że dobranie się do niestatycznych pól, metod lub właściwości wymaga obiektu danej klasy. Niestatyczną metodę można wywołać tylko na rzecz jakiegoś obiektu klasy, a nie na rzecz samej klasy.

1

Prostokat i Odcinek to klasy niestatyczne dlatego wymagają utworzenia obiektu by odwołać się do ich metod.

Error 1 An object reference is required for the non-static field, method, or property 'ConsoleApplication3.Prostokat.obwodPr()' 153 13 ConsoleApplication3

Prostokat p = new Prostokat();
p.obwodPr();

Error 2 An object reference is required for the non-static field, method, or property 'ConsoleApplication3.Odcinek.szerokosc()' 154 13 ConsoleApplication3

Odcinek o = new Odcinek();
o.szerokosc();

0

dzieki za konkretna odpowiedz dzieki maszynaz za przedstawienie jak to powinno wygladac
nie jestem za dobry w c# bo nie mialem czasu pocwiczyc a mimo to musze napisac program na zaliczenie i mam problem
bo musze napisac to na dzis :/

1

Ale co chcesz napisać, bo z kodu nic nie wynika?

0

musze napisac klasy punkt odcinek prostokat i kolo musze miec metody wlasciwe dla nich tzn np prostokat musi miec metode liczaca pole prostokata
warto naprawic ten kod czy zaczac od nowa ?

class Punkt
    {
        int x, y;
        public Punkt(int wsp_x, int wsp_y)
        { 
            x = wsp_x;
            y = wsp_y;

        }
   
    }

czy to wszystko co bede potrzebowal w klasie punkt zeby moc tworzyc odcinek ?

1

Akurat Punkt i Odcinek to ci dobrze poszedł.
Ale wyciąganie klasy Prostokat z odcinka to zły pomysł.
Niech Prostokąt po prostu zawiera cztery punkty (właściwie to będzie Czworokąt, chyba że będziesz pilnować, żeby zawsze był prostokątem...).
Okrąg to też nie odcinek, ale niech zawiera Punkt i dodatkowo wartość typu int albo double z promieniem.

Wszystkie te klasy mogą dziedziczyć po twoim ObiektGraficzny, chociaż ta klasa nic nie robi.

a Program to Program, niech nie dziedziczy po niczym.

0

a punkt moze miec pola public ?
tzn zmienne
ktos na innym forum mnie objechal za to ze sa public a potem i tak skasowali moj temat nie wiem czemu ale to nie ma tu znaczenia
jak nie sa public to wyskakuje mi blad

Error 3 'ConsoleApplication3.Punkt.x' is inaccessible due to its protection level 39 46 ConsoleApplication6

0

Azarien, jak dobrze? Jednocześnie odcinek jest punktem oraz posiada dwa punkty?

0

a jak zrobic zeby bylo dobrze stworzylem 2 obiekty typu punkt w odcinku bo tak mialem narzucone i tak kombinuje
Przy projektowaniu należy wykorzystac:

  • dziedziczenie (np. Punkt, Odcinek, etc. dziedzicza z klasy
    ObiektGraficzny),
  • agregacje (np. Odcinek powinien zawierać dwa obiekty typu Punkt)
2

Czy odcinek jest punktem? Nie! Odcinek wyznacza się między dwoma punktami, więc dobrze, że zawiera punkty, ale nie dobrze, że dziedziczy po punkt. W zadaniu masz napisane, że odcinek dziedziczy po ObiektGraficzny. To już jest bardziej logiczne. Czy prostokąt jest odcinkiem? Nie! Prostokąt można zbudować za pomocą dwóch odcinków. Czy okrąg jest odcinkiem? Nie! Okrąg zawiera przynajmniej jeden odcinek - jest nim promień. Czy program jest prostokątem? To już sobie sam odpowiedz :P

0

jest mozliwosc zeby klasy dziedziczyly miedzy soba metody ?? jesli tak jak to zrobic ?
skoro nie dziedziczeniem to jak ?
w kazdej klasie mam pisac kazda metode od nowa ??

0

temat do zamkniecia
kazdy tylko krytykuje zamiast pomoc
jak bym wiedzial jak naprawic to co jest zle to bym nie pytal a kazdy tylko wytyka co jest zle zamiast powiedziec jak to zrobic chociaz na przykladzie jesli to nie etyczne pomagac komus w pisaniu programu ...

0

Wszyscy Ci wskazują drogę, bo tak się po prostu więcej nauczysz. Zarzucenie gotowca mija się z sensem.
Po prostu punkt, odcinek, prostokąt i okrąg powinny dziedziczyć po obiekt graficzny.
Punkt może się składać z publicznych właściwości X i Y.
Odcinek z dwóch punktów i właściwości zwracającej jego długość.
Okrąg z punktu i promienia i metody liczącej pole, analogicznie do reszty prostokąt.

To wszystko załatwi Ci treść zadania.

Dodatkowo można się zastanowić czy klasa ObiektGraficzny nie powinna mieć abstrakcyjnych metod do liczenia pola czy tam czegoś jeszcze.

Jak to napiszesz, wrzucisz kod to użytkownicy, którzy mają wiedzę, a niektórzy tu naprawdę sporą napiszą Ci co jeszcze można poprawić i dlaczego. Jak na razie ten pierwszy kod jest całkiem zły(głównie pod względem projektowym).

0
byku_guzio napisał(a):

Hierarchia klas jest do niczego: od kiedy to okrąg czy prostokąt jest szczególnym przypadkiem odcinka?

W dwuwymiarowej przestrzeni, w której są tylko osie X i Z.

Sarrus napisał(a):

Prostokąt można zbudować za pomocą dwóch odcinków.

Jak się dużo wypije, to i jeden starczy. ;)

lexxd napisał(a):

jest mozliwosc zeby klasy dziedziczyly miedzy soba metody ?? jesli tak jak to zrobic ?
skoro nie dziedziczeniem to jak ?

No właśnie dziedziczeniem - jeśli dwie klasy mają wykonywać identyczne lub podobne operacje, to umieszczasz je w metodach w klasie bazowej.

Niestety, nikt tu się za Ciebie nie nauczy, ani za darmo tego nie napisze. To Ty musisz zrozumieć na czym polega dziedziczenie, a na czym agregacja, i kiedy które się stosuje.

1 użytkowników online, w tym zalogowanych: 0, gości: 1