speedy901990 / KinectMiniGames

KinectMiniGames
4 stars 7 forks source link

Accessors in C# #15

Closed speedy901990 closed 11 years ago

speedy901990 commented 11 years ago

Chodzi mi o plik Apples.cs Widać Grzesiek, że pisałeś w C++ i tak też podszedłeś do 'getteóws' i 'setterów'. C# bardzo upraszcza sprawę umożliwiając tworzenie 'accessorów' za pomocą prostej składni. Szczegóły pod TYM LINKIEM. Dzięki temu kod jest też bardziej przejrzysty. Przerób ten kod wg tego standardu.

gpasnik commented 11 years ago

Zajmę się tym wieczorem. Dzięki za informację, bo nie miałem pojęcia o istnieniu accessorów.

gpasnik commented 11 years ago

A jak wygląda sytuacja w przypadku np. pola typu Point. Chodzi mi konkretniej o 'set'. Set przyjmuje jedynie value. Czyli nie przypiszę w wywołaniu wartości Pos.x=wartosc; i Pos.y=wartosc;

Skoro w ciele klasy mam napisane coś takiego:

 private Point pos;
 public Point Pos
        {
            get
            {
                return this.pos;
            }
            set
            {
                pos = value;
            }
        }

To następnie w wywołaniu mam użyć?

Pos = new Point(x,y);
slk187 commented 11 years ago

A czekaj dobra nie konca zrozumialem twoj problem ;) Wydaje mi sie ze tak powinno byc tak jak napisales tzn nazwaObiektu.Pos = new Point(x,y); Zignoruj poprzednia odpowiedz :P

W dniu 26 lipca 2013 22:40 użytkownik Sławomir Kwaśniewski < slk1871@gmail.com> napisał:

Mylisz 2 pojecia. Accesory sa tylko do ustawienia wartosci pól w klasie. A konstruktor jest to utworzenia obiektu i nadanie wartosci pól w momencie utworzenia. Innymi slowy Accesory tworzysz do wypelnienia X i Y a konstruktor do utworzenia obiektu. private int x; public int X {get; set;}

i tak samo dla Y

W dniu 26 lipca 2013 20:00 użytkownik grzesiekmos < notifications@github.com> napisał:

A jak wygląda sytuacja w przypadku np. pola typu Point. Chodzi mi

konkretniej o 'set'. Set przyjmuje jedynie value. Czyli nie przypiszę w wywołaniu wartości Pos.x=wartosc; i Pos.y=wartosc;

Skoro w ciele klasy mam napisane coś takiego:

private Point pos; public Point Pos { get { return this.pos; } set { pos = value; } }

To następnie w wywołaniu mam użyć? Pos = new Point(x,y);

Reply to this email directly or view it on GitHubhttps://github.com/speedy901990/KinectMiniGames/issues/15#issuecomment-21637551 .

speedy901990 commented 11 years ago

Sprawdzone i działa w 100%:

Point p;

Point P
{
    get { return this.p; }
    set { this.p = value; }
}
// ...

// usage
P = new Point(3, 4);
label1.Text = P.ToString();
gpasnik commented 11 years ago

A w przypadku pola color?

Ustawiony przeze mnie wcześniej setter wygląda następująco: Przyjmuje inta z zakresu 1-3, i w zależności od tego co się wylosuje to nadawany jest jeden z trzech kolorów. Szkoda, że tych akcesorów z C# nie można sparametryzować (chyba, że jest jakiś sposób o którym nie wiem)

private void setColor(int colourParam)
        {
            switch (colourParam)
            {
                //Red
                case 1:
                    color = Color.FromArgb(255, 255, 0, 0);
                    break;

                //Green
                case 2:
                    color = Color.FromArgb(255, 0, 255, 0);
                    break;

                //Yellow
                case 3:
                    color = Color.FromArgb(255, 255, 255, 0);
                    break;

                default:
                    color = Color.FromArgb(255, 255, 0, 0);
                    break;
            }
        }
speedy901990 commented 11 years ago

Niestety nie da się ich sparametryzować. A dlaczego nie możesz zrobić zwykłego get; set; a potem przypisywać im po prostu COLORr zamiast INT ? To nie powinno mieć znaczenia bo i tak jakoś tego INTa musisz wcześniej wybrać do przypisania. Jeśli będziesz potrzebował jakieś operacje na INTach gdzieś robić, to zawsze będziesz mógł użyć np 'KeyValuePair<>' żeby powiązać z INTa z COLOR. Może Cię przeraża to Color.FromArgb(...) i chciałeś to ukryć. Oczywiście to wygląda bardzo brzydko dlatego polecam wykorzystać 'System.Windows.Media.Colors' przez co kod wygląda bardziej przyjaźnie.

Color col = Colors.Red;