Array obiektow oraz random

0

Ucze sie dopiero programowania w c# i natknąłem się na pewien problem

1. Mam zwykła klasę "Auto" i chciałem stworzyć tablice obiektów tej klasy, chcialem także by atrybuty obiektów były wypełnione konstruktorem, starania zrobienia tego jak zwykłej tablicy nie powiodły się. W internecie zauważylem ze można do tego wykorzystać array. Zrobiłem to tak:

object[] array1 = new object[40]; // deklaracja arrayu o wielkosci 40
        for (int i = 0; i < 40; i++)
        {
            array1[i] = new Auto(i); //stworzenie 40 obiektow klasy Auto i wsadzenie ich do array1               
        }
        foreach (Auto element in array1) //dla kazdego elementu w array1 wykonaj metode klasy auto
        {
            element.Write();
        }

Jak widzicie wykorzystałem foreach by wywoływać metody obiektów przechowywanych w array jednak nie mam zielonego pojęcia jak wybrać konkretny pojedynczy obiekt zawarty w array np. nr. 5 i wykonać jego metodę. Może mi ktoś doradzić jak?

Myślałem, że może da się poprzez "array1[1].Metoda();" ale tak się nie da.

**2**. Kolejna sprawa, używam Visual Studio 11 Beta ( może to będzie potrzebna informacja :P )
oto kod mojego konstruktora:
<code class="c#">public Auto(int Id)
            {
                id = Id;
                Random rand = new Random();
                pojemnosc = rand.Next(1, 5);
                predkosc = rand.Next(100, 300);
                switch (rand.Next(1, 5))
                {
                    case 1: marka = "BMW"; break;
                    case 2: marka = "Audi"; break;
                    case 3: marka = "Daewoo"; break;
                    case 4: marka = "Mercedres"; break;
                    case 5: marka = "Porshe"; break;                        
                }
            }

Tworzy on obiekty z powyższego przykładu, problem polega na tym ze "losowanie" randoma jest tak jakby przeprowadzane tylko raz i wszystkie obiekty otrzymują takie same atrybuty ( oprócz id który prawidłowo jest inny dla każdego obiektu). Jednak gdy w pętli for w której tworzone są obiekty ustawie Breakpoint i puszczam program instrukcje po instrukcji to wszystko działa tak jak należy i każdy obiekt otrzymuje losowe wartości. Ktoś może wie co jest nie tak?

1
  1. Trzeba tutaj zastosować rzutowanie - musimy powiedzieć kompilatorowi jakiego typu będzie element, który chcemy wybrać. Na przykład
(array1[5] as Auto).Write()

Można jeszcze wykorzystać rzutowanie takim sposobem:

Auto a = (Auto)array1[5];
a.Write();

Polecam przeczytać czym różnią się te sposoby, i ogólnie o rzutowaniu - jest to bardzo przydatne :)

  1. Żeby uniknąć powtarzalności wyników przekaż w konstruktorze Randoma parametr Id, którzy pobierasz w tym konstruktorze. Jest to ziarno, na podstawie którego następne liczby będą losowane.
0
Vehumet napisał(a):

1. Mam zwykła klasę "Auto" i chciałem stworzyć tablice obiektów tej klasy, chcialem także by atrybuty obiektów były wypełnione konstruktorem, starania zrobienia tego jak zwykłej tablicy nie powiodły się.

Co konkretnie się nie powiodło?

W internecie zauważylem ze można do tego wykorzystać array. Zrobiłem to tak:

Słowo "array" oznacza w języku angielskim tablicę, nic poza tym.

Zrobiłem to tak:

object[] array1 = new object[40]; // deklaracja arrayu o wielkosci 40

        for (int i = 0; i < 40; i++)
        {
            array1[i] = new Auto(i); //stworzenie 40 obiektow klasy Auto i wsadzenie ich do array1               
        }
        foreach (Auto element in array1) //dla kazdego elementu w array1 wykonaj metode klasy auto
        {
            element.Write();
        }
> 
> Jak widzicie wykorzystałem foreach by wywoływać metody obiektów przechowywanych w array jednak nie mam zielonego pojęcia jak wybrać konkretny pojedynczy obiekt zawarty w array np. nr. 5 i wykonać jego metodę. Może mi ktoś doradzić jak?

A dlaczego tworzysz tablicę typu `object`? To tylko utrudnianie sobie życia, przecież możesz tak:
<code class="c#">
Auto[] array1 = new Auto[40]; // deklaracja arrayu o wielkosci 40
            
            for (int i = 0; i < 40; i++)
            {
                array1[i] = new Auto(i); //stworzenie 40 obiektow klasy Auto i wsadzenie ich do array1               
            }
            foreach (Auto element in array1) //dla kazdego elementu w array1 wykonaj metode klasy auto
            {
                element.Write();
            }

Tworzy on obiekty z powyższego przykładu, problem polega na tym ze "losowanie" randoma jest tak jakby przeprowadzane tylko raz i wszystkie obiekty otrzymują takie same atrybuty ( oprócz id który prawidłowo jest inny dla każdego obiektu). Jednak gdy w pętli for w której tworzone są obiekty ustawie Breakpoint i puszczam program instrukcje po instrukcji to wszystko działa tak jak należy i każdy obiekt otrzymuje losowe wartości. Ktoś może wie co jest nie tak?

Wszystko jest w porządku. Przy każdym utworzeniu obiektu Auto tworzysz obiekt Random, który jest na nowo tworzony. Przy normalnym uruchomieniu wszystkie te inicjalizacje i losowania są przeprowadzane w tym samym czasie, więc ich wyniki są identyczne. Gdy debugujesz, to między losowaniami są przerwy, więc ich wyniki są różne.
Aby się pozbyć tego niechcianego efektu najlepiej ustawić obiekt Random jako static, wtedy jest współdzielony między wszystkie obiekty klasy, i jednokrotnie tworzony, więc każe kolejne losowanie zwróci inny wynik.

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