C# dostęp do właściwości obiektu z listy


(Jarek P) #1

Witam.

Mam jakąś tam listę obiektów stworzonej przeze mnie klasy "gracz", która ma jakieś tam właściwości.

private void start(int lg)

        {

            List lista_graczy = new List();


            for (int l = 0; l < lg; l++)

            {

                lista_graczy.Add(new gracz("jarek"));                                 

            }            

        }

Pytanie brzmi: Jak zmienić właściwość obiektu z listy? Próbowałem czegoś w stylu

lista_graczy[0].imie

ale niestety się nie udało.

PS. To jest funkcja, która ma dynamicznie tworzyć obiekty.


(LonngerM) #2

Jeśli się nie mylę listy jako obiekty posiadają "itemy" spróbuj coś takiego:

lista_graczy.item[0].imie

(Jarek P) #3

Niestety nie działa :frowning:


(Frankfurterium) #4

Teraz wygląda to tak:

  1. Wywołujesz funkcję

  2. Tworzysz listę

  3. Przypisujesz do niej wartości

  4. Funkcja 'się kończy'

  5. Odśmiecacz niszczy listę i zawartość

Próbujesz się odwołać do czegoś, co traci ważność po zakończeniu działania funkcji.

Listę albo twórz poza blokiem funkcji i przekazuj ją do wewnątrz jako parametr, albo wypluwaj ją na zewnątrz returnem.

[edit]

A jeżeli nie możesz się do elementu odwołać wewnątrz funkcji poprzez

lista_graczy[0].imie

sprawdź, czy atrybut imie nie jest w klasie opisany jako private.


(Somekindsoftware) #5

LonngerM , bardzo się mylisz.

Jarek P , w tym kodzie wszystko jest w porządku, więc błąd jest gdzie indziej. Pokaż więcej kodu, bo może być tak jak napisał Frankfurterium.


(Jarek P) #6

Chmmm. Tu jest kod błędu:

Error 1 'gracz.imie' is inaccessible due to its protection level


(Frankfurterium) #7

W takim razie, jak już pisałem, sprawdź, czy składowa imię klasy gracz nie jest opatrzona specyfikatorem dostępu private (lub czy nie ma żadnego specyfikatora, co w C# jest chyba (sory, narzecza mi się ostatnio trochę mylą) tożsame). Oznacz atrybut imie jako public , tj.

public string imie;

Jeżeli zależy ci na zachowaniu private'a, dołóż do klasy specjalne metody odpowiedzialne za pobieranie i zwracanie wartości:

public string getImie()

	{

		return this.imie;

	}


public void setImie(string imie)

	{

		this.imie = imie;

	}

Wtedy wewnątrz funkcji będziesz operował elementami listy :

lista_graczy[0].getImie(); // wyciągnięcie imienia

lista_graczy[0].setImie("Arek"); // nadanie imienia

(Jarek P) #8

Dzięki. To powinno wystarczyć.


(Somekindsoftware) #9

Tak się robi w C++ lub Javie. W C# w tym celu stosuje się właściwości.


(Jarek P) #10

Działa. Mam jeszcze jedno pytanie. Chciałbym do tego dorobić osobną formę z ustawieniami. Jak zmienić zmienne formy1 z formy2? I czy jest to w ogóle możliwe ?

-- Dodane 28.12.2011 (Śr) 22:00 --

  • jeszcze jeden problem do kompletu, a mianowicie:

Program dochodzi do momentu, w którym jest 8 opcji do wyboru. Jak sprawić, żeby po kliknięciu na przycisk w menu wywoływała się metoda w głównej metodzie, a nie w metodzie tegoż przycisku ?


(Somekindsoftware) #11

1) Zrób w Form1 publiczne metody, które będą operowały na jej zmiennych.

2) W Form2 zrób pole typu Form1 ustawiane w konstruktorze.

3) Wówczas w obiekcie typu Form2 będziesz miał dostęp do tych metod z Form1, które Cię interesują.

Co rozumiesz przez "metodę w metodzie"? C# nie pozwala na zagnieżdżanie metod.


(Jarek P) #12
private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)

        {

// Po kliknięciu metoda wywoła się tu:

mojametoda();

        }

A chciałbym, żeby wykonywała się tu:

public void start()

        {


//Tu ma się wykonać po kliknięciu w Buttona.


        }

(Frankfurterium) #13

Ale... po co? Co starasz się osiągnąć? Trochę nie ogarniam.

Po wciśnięciu buttona chcesz tylko odpalić mojametoda()? Dlaczego jej 'położenie' jest dla ciebie takie istotne?

Chyba że zależy ci na wywołaniu całej metody start(), bo masz w niej inną zawartość, w tym mojametoda(). W takim razie wystarczy

private void menuStrip1_ItemClicked(object sender, ToolStripItemClickedEventArgs e)

        {

              start();

        }


public void start()

        {

              mojametoda();

        }

(Jarek P) #14

Ano widzisz chodzi oto, że metoda start jest dosyć ważna i dochodzi do momentu, w którym ma się wykonać inna metoda, w zależności od tego, co wybrał użytkownik. Owa kolejna metoda jest przedłużeniem tej metody. To ma być coś ala sterowanie w grach. Mam nadzieje, że nie napisałem tego zbyt zawile.


(Frankfurterium) #15

A nie pomyślałeś nigdy, że przed przystąpieniem do pisania gry warto napisać kilka typowo wprowadzających programów z jakiegoś tutoriala, żeby nabrać biegłości w podstawach? Widać, że postawiłeś sobie ambitny cel, ale co chwilę borykasz się z problemami, które rozwiązałoby choćby pobieżne przerobienie któregoś z naprawdę podstawowych kursów dostępnych w internecie (np. na portalu CentrumXP). Oczywiście najlepiej uczy się właśnie poprzez praktykę, ale przedtem warto dowiedzieć się, jak funkcjonują, co zawierają i jak między sobą oddziałują klasy i ich obiekty. Wtedy już na pewno wiedziałbyś, o co pytać, bo teraz prawie cały czas trzeba zgadywać 'O co ci chodzi?'.