<object> do <MojaKlasa>

0

Witam,
Jak przekonwertować object do MojaKlasa.

List<MojaKlasa> lista = new List<MojaKlasa> 
{
new MojaKlasa(1,2,3),
...
};

Chciałbym by dowolnego typu < > listę mi jakaś funkcja wypisywała.

static void wypisz( List<object> lista )
{
//... i tu chciałem jakoś Castować
List<MojaKlasa> = (MojaKlasa)lista; // oczywiscie to nie działa. 

Ogólnym problemem jest by wysyłac dowolny typ klasy (zakładamy że wnętrze klasy jest takie same)

class Dom{ 
int a;
string b;
}
class Zwierzak{ 
int a;
string b;
}
class Przyroda{ 
int a;
string b;
}

jak: <Dom> <Zwierzak> lub <Przyroda> i całość jakoś Castowało z Objectu na ów <typy> a następnie wywoływać wypisywać na ekran zawartosc list.

Pozdrawiam i z góry dziękuję.

2

Niemożliwe jest bezpieczne zrzutowanie dowolnego obiektu na dowolny inny, który nie jest powiązany z nim w żaden sposób bądź znajduje się wyżej w hierarchii.

W Twoim przypadku kod powinien wyglądać tak:

class Costam {
	int a;
	string b;
}

class Dom: Costam { 
}

class Zwierzak: Costam {
}

class Przyroda: Costam { 
}

/* ... */

void wypisz(List<Costam> lista) {
}

Natomiast zastanów się, czy aby na pewno istnieje potrzeba, abyś miał odrębne obiekty Dom, Zwierzak oraz Przyroda, skoro nie wprowadzają one nic nowego do aplikacji.

2

@wonman, jeśli Twoim celem jest tylko wypisywanie, to jest to dość proste:

 static void wypisz(List<object> lista)
{
    foreach(var o in lista)
    {
        Console.WriteLline(o);
    }
}

Musisz tylko odpowiednio przeciążyć ToString w swoich klasach.
Ale oczywiście bezpieczniej mieć jakąś własną klasę bazową, jak pokazał @Patryk27. Dodałbym tylko, że klasa bazowa powinna być abstract.

0

Piszczy mi program, że gdy wysyła

//Main:
List<Zwierzak> koko = new List<Zwierzak>()
            {
                new Zwierzak("Tygrys", 'K', 36),
                new Zwierzak("Piesss", 'M', 89),
                new Zwierzak("Kangur", 'K', 33),
                new Zwierzak("Kuraaa", 'M', 65),
                new Zwierzak("Lemurr", 'M', 22),
                new Zwierzak("Kaczka", 'M', 22),
                new Zwierzak("Kaczka", 'K', 89),
                new Zwierzak("Kangur", 'K', 33),
            };
p1.przeslij(koko);
//klasa Zwierzak
public override string ToString()
        {
            return;
        }

public void przeslij(List<object> lista)
        {
            foreach (var item in lista)
            {
                Console.WriteLine(lista);
            }
        }

cannot convert from 'System.Collections.Generic.List<Linku3.Zwierzak>' to 'System.Collections.Generic.List<object>'

W jaki sposób należy przeciążyć toString() i to wywyołać?

1

Skoro funkcja oczekuje listy zwyczajnych, prostych obiektów, nie możesz do niej przesyłać listy zwierzaków.

1

Coś mi tu nie pasuje- ten błąd nie wygląda jakby miał związek z podanym kodem. Problemem w tym kodzie jest to że do metody WriteLine przekazujesz listę po której iterujesz zamiast konkretne obiekty- item. Kompilator i tak powinien wywalić z błędem ale dla tego że metoda WriteLine może przyjąć pojedynczy obiekt a nie ich listę. Poza tym alternatywnym rozwiązaniem jest skorzystanie z typów generycznych:

 
        static void Write<T>(List<T> list)
        {
            foreach (T obj in list)
                Console.WriteLine(obj);
        }

Aha i nazywaj metody z wielkiej litery zgodnie z konwencjami.

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