Wątek przeniesiony 2016-06-11 15:36 z C# i .NET przez somekind.

Klasa z obiektami innej klasy

0

Witam czy może mi ktoś wytłumaczyć jak stworzyć klasę w której mam 4 obiekty innej klasy.

Chodzi mi o coś takiego
i przy tworzeniu obiektu klasy prostokąt za pomocą właściwości / albo po prostu konsola pyta użytkownika po kolei o dane pkt które ma wpisywać - obojętne który sposób.

 class Program
    {
        class Punkt
        {
            int x, y;
            public Punkt(int _x,int _y)
            {
                x = _x;
                y = _y;
            }
        }
        class Prostokat
        {
            static int x1, y1;
            Punkt p1 = new Punkt(x1, y1);
            Punkt p2 = new Punkt(x1, y1);
            Punkt p3 = new Punkt(x1, y1);
            Punkt p4 = new Punkt(x1, y1);

            public Prostokat(Punkt _p1,Punkt _p2,Punkt _p3,Punkt _p4)
            {
                p1 = _p1;
                p2 = _p2;
                p3 = _p3;
                p4 = _p4;
            }
            public Prostokat(int iks,int igr)
            {
                x1 = iks;
                y1 = igr;
            }
        }
        
        static void Main(string[] args)
        {
            Prostokat pro = new Prostokat(2, 3);
            Console.WriteLine(pro);

            Console.ReadKey();
        }
    }
3
  1. Chyba masz na myśli tworzenie obiektu z czterema w środku, bo klasę to już masz. Klasa to definicja ze słowem class na początku, obiekt to konkretne wystąpienie klasy tworzone konstruktorem.

  2. Konstruktor Prostokat(int iks,int igr) nie ma zbytnio sensu, bo przepisywanie jego parametrów do obiektu nie ma wpływu na punkty. Jak sobie ustawisz breakpointy w tym konstruktorze i w Punkt p1 = new Punkt(x1, y1);, to zostanie złapany najpierw ten drugi. Czyli najpierw ustawiasz sobie wszystkie punkty na (0,0), bo takie są początkowe wartości x1 i y1, a dopiero potem ustawiasz x1 i y1. Tylko wtedy punkty nie zostaną zaktualizowane. Żeby tak nie było, tworzenie punktów powinno odbywać się na końcu tego konstruktora, a nie w miejscu deklaracji.

  3. Swoją drogą, x1 i y1 nie są potrzebne, zwłaszcza static. To słowo oznacza, że każdy tworzony prostokąt miałby takie same wartości x1 i y1, a to nie ma sensu.

  4. Jeśli chcesz sobie wypisać na konsolę utworzony prostokąt, to jest jedna sprawa. Console.WriteLine() pisze tekst, więc albo dostaje jako parametr coś już będącego tekstem, albo próbuje sobie z tego parametru jakoś tekst zrobić. W przypadku typów prostych, wbudowanych np. liczb działa to od razu, ale jak masz obiekt, to jest on rzutowany przez wywołanie na nim metody ToString() dziedziczonej z object. Domyślnie wynikiem jest pełna nazwa klasy, a żeby tak nie było, to trzeba nadpisać tę metodę. Czyli w klasie Prostokat musi być

            public override string ToString()
            {
                return ...
            }

gdzie musisz sobie zdefiniować, co chcesz napisać o danym obiekcie. Informacja o prostokącie zapewne będzie wymagała współrzędnych jego punktów, więc taką metodę trzeba też dodać do klasy Punkt.

  1. Powyższe uwagi załatwiają działanie dotychczasowego kodu. Jeśli chcesz pytać użytkownika o współrzędne każdego punktu, to muszą być 4 cykle pytanie-odpowiedź. Czyli piszesz prośbę o podanie współrzędnych i odczytujesz odpowiedź np. przez Console.ReadLine(), po czym każdą współrzędną konwertujesz przez int.Parse() (wersja uproszczona, bez sprawdzania, czy użytkownik podał liczbę) lub int.TryParse() (wersja ze sprawdzaniem poprawności) i przechowujesz je gdzieś w zmiennych, a na końcu tworzysz prostokąt z tymi zmiennymi jako parametrami konstruktora.
1
using System;

namespace perf
{
    internal class Program
    {
        private class Point
        {
            private int X { get; }
            private int Y { get; }
            public Point(int x, int y)
            {
                X = x;
                Y = y;
            }

            public override string ToString()
            {
                return $"X: {X}, Y: {Y}";
            }
        }

        private class Rectangle
        {
            public Point TopLeft { get; set; }
            public Point TopRight { get; set; }
            public Point BottomLeft { get; set; }
            public Point BottomRight { get; set; }

            public override string ToString()
            {
                return $"TopLeft: {TopLeft}, TopRight: {TopRight}, BottomLeft: {BottomLeft}, BottomRight: {BottomRight}";
            }
        }

        private static void Main()
        {
            var rect = new Rectangle
            {
                TopLeft = new Point(0, 10),
                TopRight = new Point(10, 10),
                BottomLeft = new Point(0, 0),
                BottomRight = new Point(10, 0),
            };
            Console.WriteLine(rect);
            Console.ReadLine();
        }
    }
}
0

Mam jeszcze pytania w klasie Point użyto tylko get z powodu że wartość X ma zostać tylko pobrana z konstruktora a w klasie Rectangle uzyto get set z powodu ze tutaj get najpierw pobiera wartość z point a set następnie ustawia ja dla obiektu tak?

0

Jeszcze ostatnie pytanie bo nurtuje mnie, co oznacza ten operator $? I dlaczego return "x {0},y {1}",X,Y; nie działa?

1

$"X: {X}, Y: {Y}" oznacza zwroc napis w ktorym zawartosc {} jest podmieniona odpowiednimi wartosciami z danego kontekstu. jest to nowosc w jezyku wiec moze moze nie dzialac jesli masz starsza wersje.
dlaczego return "x {0},y {1}",X,Y; nie działa? bo c# nie dopuszcza takiej skladni. musialbys dac string.Format("x {0},y {1}",X,Y);

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