• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C# przesyłanie dziedzica

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
+2 głosów
279 wizyt
pytanie zadane 17 lipca 2016 w C# przez niezalogowany
Witam, posiadam kilka klas dziedziczących od jednego "rodzica".

Każda z tych klas jest w osobnej List. Chcę przesłać do funkcji te List ale żeby to nie było na zasadzie że tworzę tyle funkcji ile jest List tylko żeby to była jedna wspólna funkcja. Myślałem nad tym problemem gdybym przesyłał jeden obiekt, ale nawet z tym coś mi nie idzie. Będę dalej nad tym myśleć, ale jakby ktoś mógłby mi pomóc.

1 odpowiedź

+1 głos
odpowiedź 20 lipca 2016 przez achilles147 Dyskutant (9,580 p.)
wybrane 21 lipca 2016
 
Najlepsza
Co to znaczy że "klasa jest w osobnej list"?
komentarz 20 lipca 2016 przez niezalogowany
napiszę to skrócone
List<Klasa1>
List<Klasa2>

i wszystkie dziedziczą z Klasa, na tej zasadzie mam w kodzie, po prostu inne nazwy klas tutaj dałem
komentarz 21 lipca 2016 przez achilles147 Dyskutant (9,580 p.)

czyli z tego co rozumiem chcesz zrobić metodę ( to nie są funkcje!), i to taką, która wykona operację na obu tych obiektach( List<Klasa1> i List<Klasa2>). Możesz to zrobić np za pomocą mechanizmu generyczności.

private List<int> lista1;
private List<string> lista2;

private void Metoda<T>(List<T> lista)
{
	//LOGIKA
}

 

komentarz 21 lipca 2016 przez achilles147 Dyskutant (9,580 p.)
edycja 21 lipca 2016 przez achilles147

Możesz też skorzystać z interfejsu IEnumerable:



// KLASA B i KLACA C Dziedziczą po klasie A
private List<B> lista1;
private List<C> lista2;


private void Metoda(IEnumerable<A> lista)
 {
	       //LOGIKA
 }

 

I tutaj krótkie wyjasnienie dlaczego własnie IEnumerable. Lista to klasa, która ma metody silnie typowane. Czyli operują tylko na określonym typie. Natomiast IEnumerable jest interfejsem, który operuje na słabo typowanych danych. Co ciekawe w tej metodzie możesz sobie zrobić jeszcze lista.ToList() co da Ci efekt jaki prawdopodobnie chciałeś osiągnąć.

 

komentarz 21 lipca 2016 przez niezalogowany
Spróbuje to zrobić tym pierwszym sposobem, bo o tym słyszałem ale nigdy nie używałem, natomiast o tym drugim sposobie poczytam. Dzięki wielkie za pomoc :)
komentarz 21 lipca 2016 przez niezalogowany
Mógłbyś mi jeszcze powiedzieć jak zrobić żeby przy tym pierwszym sposobie działały operatory dodawania itd??
komentarz 21 lipca 2016 przez achilles147 Dyskutant (9,580 p.)
podaj przykład co dokładnie chcesz zrobić. Operatory dodania pomiędzy czym? . Chcesz dodać obiekt do listy ?
komentarz 21 lipca 2016 przez niezalogowany

w każdej z klas mam przeładowany operator odejmowania i zauważyłem że w niektórych miejscach w kodzie mógłbym użyć tego Generic (dobrze napisałem??) tyle że musiałbym tam użyć tego operatora. Może pokażę:

private void UsuwanieElementu<T>(ref List<T> lista, ref uint ile)
        {
            if (ile >= lista[KtoryZaznaczony()].Ilosc)
            {
                lista.RemoveAt(KtoryZaznaczony());
            }
            else
            {
                lista.Add(lista[KtoryZaznaczony()] - ile);
                lista.RemoveAt(KtoryZaznaczony());
            }
        }

 

komentarz 21 lipca 2016 przez achilles147 Dyskutant (9,580 p.)

Już rozumiem:)

No to teraz czas pójść trochę dalej i dowiedzieć się czym są ograniczenia (ang. constraints) w świecie C#. Na ten moment twoja metoda wie, że zostać może wywołana z jakim kolwiek typem T. C# jednak pozwala powiedzieć twojej metodzie, że typ T wcale nie będzie "wszystkim" a np jakaś twoją klasą.

a więc tak to wygląda w praktyce:

private static void Metoda<T>(List<T> lista) where T : A
 {
        //LOGIKA
 }

I w ten sposób powiedzieliśmy kompilatorowi, że T może być każdym typem pochodzącym z rodziny A.

Więcej o ograniczeniach możesz przeczytać tutaj:

https://msdn.microsoft.com/pl-pl/library/d5x73970.aspx

komentarz 21 lipca 2016 przez niezalogowany
Ok wielce mi pomogłeś :) teraz sam poszukam rozwiązania z tym operatorem, bo w klasie podstawowej nie mam go zdefiniowanego.

Podobne pytania

0 głosów
1 odpowiedź 174 wizyt
pytanie zadane 12 listopada 2016 w C# przez Corazzo Obywatel (1,040 p.)
0 głosów
1 odpowiedź 659 wizyt
pytanie zadane 23 października 2020 w C# przez matlenek00 Nowicjusz (180 p.)
0 głosów
2 odpowiedzi 905 wizyt
pytanie zadane 2 grudnia 2015 w C# przez mrcnsct Nałogowiec (36,390 p.)

93,440 zapytań

142,431 odpowiedzi

322,679 komentarzy

62,802 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...