Lista genetyczna List<T> zawierająca elementy z wewn. listami

0

Witam

Obecnie poznaję język C#, jestem po etapie klas generycznych. W związku z tym mam do was pytanie.

Czy można utworzyć listę generyczną List<T> gdzie jako typ T podaję obiekt zawierający już w sobie wewnętrzne klasy genetyczne. Na przykład taka struktura.

//klasa opisująca
	class material
	{
                public double cena;

		struct material_data  //pary zawierające cechę opisującą przedmiot oraz wartość cechy
		{
			string cecha;
			double warosc;
			
			public material_data(string x, double y)
			{
				cecha = x;
				warosc = y;
			}
		}
		
		List<material_data> opis = new List<material_data>(); //lista zawierająca wszystkie cechy
		
		public void dodaj_cecha (string x, double y) //metoda dodająca poszczególne cechy do listy
		{
			material_data poz_opisu = new material_data(x, y);
			opis.Add(poz_opisu);
		}	
	}

Main

public static void Main(string[] args)
		{
			//kod programu
			List<material> towar = new List<material>();
			material oprzyz = new material();
			oprzyz.dodaj_cecha("Ciężar", 15);
			oprzyz.dodaj_cecha("Segment", 3);
			oprzyz.dodaj_cecha("Kategoria izolacji napięciowej", 1000);
			towar.Add(oprzyz);
		} 

Czy tym sposobem mogę dodawać do listy towar poszczególne pozycje zawierające wewnętrzne listy ? Wewnętrzne listy nie koniecznie muszą mieć tyle samo elementów. Tu w tym przykładzie dodałem jedną pozycję z trzema cechami, ale w dalszym przykładzie opisywany przedmiot będzie miał np 5 cech.

			material oprzyz1 = new material();
			oprzyz1.dodaj_cecha("Ciężar", 15);
			oprzyz1.dodaj_cecha("Segment", 3);
                        oprzyz1.dodaj_cecha("Atest, 4);
                        oprzyz1.dodaj_cecha("liczba elementów", 2);
			oprzyz1.dodaj_cecha("Kategoria izolacji napięciowej", 1000);
			towar.Add(oprzyz1);

Wobec tego pierwsza pozycja "towar" będzie miała tylko trzy cechy, natomiast kolejna pozycja będzie miała 5 cech.

Czy mogę również u klasie "material" umieścić więcej list generycznych ?

0
  1. Jeśli chcesz zrobić List<material>, przy czym material ma w sobie mieć List<material_data>, to nie ma problemu przecież.
  2. W nazwach nie stosujemy podkreśleń, nazwy klas i metod piszemy wielką literą i każde ich słowo składowe również.
  3. Nie ma sensu, żeby material_data było struct.
0
somekind napisał(a):
  1. Nie ma sensu, żeby material_data było struct.

Mógłbyś dokładniej opisać rozwiązanie które byłoby lepsze ?

Na szybko dopisałem taką klasę "material" uwzględniając trzy powyższe punkty, wobec czego dotychczasowy element "material_data" zastąpiony przez "Cechy"

	class Material
	{
		public double Cena;
		
		class Cechy
		{
			string OpisCechy;
			double Wartosc;
			
			public Cechy(String x, double y)
			{
				OpisCechy = x;
				Wartosc = y;
			}
		}
		
		List<Cechy> Opis = new List<Material.Cechy>
			
		public void DodajOpis (string x, double y)
		{
			Cechy PozycjaOpisu = new Cechy(x, y);
			Opis.Add(PozycjaOpisu);
		}
					
	}

Czy to rozwiązanie będzie lepsze od poprzedniego ?

0
  1. Nie ma sensu, żeby material_data było struct.
    Opowiedzałbym się za struct, przynajmniej będzie pewność, że nigdy nie ma null, oraz nie zajdzie sytuacja, w której dwa różne materiały mają ten sam obiekt jako cechę (w ten sposób że zmiana w jednym zmienia drugi).

Albo w ogóle brak osobnego typu, tylko pola w klasie „luzem”.

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