Budowanie hierarchii elementów używając dziedziczenia.

0

Próbuję zrozumieć interfejsy i klasy abstrakcyjne, i nie mogę pojąć ważnego elementu oszczędzania mocy obliczeniowej i pamięci.

abstract class Przedmiot{
    public string _nazwa{ get; private set; }
    public string _opis{ get; private set; }
    public float _cena{ get; private set; }
}

Mam klasę Przedmiot.cs i będą ją dziedziczyły wszystkie przedmioty np.:

class Miecz : Przedmiot{
    public int _obrazenia{ get; private set; }
}
class Jablko : Przedmiot{
    public int _wartosciOdzywcze{ get; private set; }
}

Pytanie co do "oszczedzania pamięci" - zakładam że mam w ekwipunku 5 jabłek. Każde jabłko jest takie same - ma te same: nazwę, opis i cenę. Zakładam że np. opis zajmuje 100B miejsca. Jako że mam 5 jabłek, więc każde ma ten sam opis, czyli zajmują 500B - wydaje mi się to marnotrawstwem zasobów, ale gdyby zrobić zamiast nazwy, int'a który wskazywałby na ID opisu w jakiejś innej liście zajmowałoby to 20B a nie 500B. Nie mogę jednak pojąć jak sobie z tym poradzić, gubię się. Są to minimalne wartości, ale przy większej skali mogłoby to mieć znaczenie i chciałbym mieć to na uwadze. Dodatkowo nie wiem jak odwołać się do tych klas używając jakiejś metody - np. chcę dodać jabłko do ekwipunku - AddItem( ... ) - co podać w argumencie, skoro chcę to robić automatycznie? Klasę, ale mam ich np. 1000? String'a a potem sprawdzać w if'ie którą klasę dodać, ale co zrobić jak jest 1000+ przedmiotów? Mam problem z tym 'schematem' budowania hierarchii, nie wiem jak to ułożyć...

Ps. Chciałbym poznać jakieś rozwiązanie 'ogólne'. Jak takie coś budować? Jak się zabrać za takie coś? Podałem tylko przykład z przedmiotami, ale zamierzam to wykorzystać do wielu innych rzeczy.

Ps2. Mogę podać najprostszy przykład... Minecraft i jego API (http://takahikokawasaki.github.io/minecraft-resources/javadoc/forge/1.8-11.14.1.1320/net/minecraft/item/package-tree.html):
net.minecraft.item.Item
|- net.minecraft.item.ItemArmor
|- net.minecraft.item.ItemBlock
| |- net.minecraft.item.ItemCloth
| |- net.minecraft.item.ItemLeaves...
|- net.minecraft.item.ItemBed...

0

Bez sensu sie przejmujesz bajtami. Do tego starasz sie byc madrzejszy od CLR co nie jest zalecane. Dzisiejsze kompy maja po 8 GB ramu, nie przejmuj sie ze cos bierze 300 Bajtow wiecej.

Dodatkowo zupelnie zle liczysz bajty, bo tak to nie dziala w c#. Stringi w C# sa immutable, wiec jezeli cokolwiek w nim zmienisz to bedzie alokowana pamiec dla nowego. Jezeli chcesz zobaczyc co dokladnie robi kod to musisz ten C#owy przepuscic do IL code
http://www.vijaymukhi.com/documents/books/ilbook/chap2.htm

To co chcesz robic tutaj to premature optimalization. Duzo lepiej miec czytelny kod niz jakies wskazywania na id tekstu czy opisu...

ale przy większej skali mogłoby to mieć znaczenie i chciałbym mieć to na uwadze.

bedziesz miec wieksza skale wtedy bedziesz mogl zmienic, ta zmiana bedzie i tak drobna jezeli w ogole bedzie potrzebna

to dodawanie automatyczne cos tam klas to w ogole nie rozumiem o co Ci chodzi. Mozesz pokazac na przykladzie? (pseudo kod czy cos?)

Jezeli chodzi Ci o tworzenie ekwipunku to zapoznaj sie z wzorcami takimi jak Abstract Factory oraz Builder. Zawsze tez mozesz miec w klasie bazowej virtualna funkcje create i wtedy potomki beda definiowac siebie jak beda tworzone. Dzieki temu mozesz przekazac do Factory ogolny obiekt i Factory niech robi po prostu na nim create. Przy takim rozwiazaniu bedziesz musial rzutowac na odpowiedni typ

0

Problem, o który Ci się rozchodzi, rozwiązuje między innymi wzorzec pyłek (flyweight) - natomiast nie w takiej skali, w jakiej chciałbyś to wykorzystać.
Najpierw napisz kod i dopiero jeśli będzie problem z nadmiernym wykorzystaniem pamięci, zacznij się nim przejmować.

0

@fasadin

to dodawanie automatyczne cos tam klas to w ogole nie rozumiem o co Ci chodzi. Mozesz pokazac na przykladzie? (pseudo kod czy cos?)

No zakładając że mam np.:

class Jablko : Przedmiot{}
class Mleko : Przedmiot{}
class Ciastko : Przedmiot{}

ktoś dostaje od kogoś przedmioty, to jak zatwierdzi ofertę - automatycznie powinny się one dodać na zasadzie AddItem( ... ) - tylko teraz co w argumencie? Widzę to tak:

if(arg == "Jablko") AddItem(Jablko); else
if(arg == "Mleko") AddItem(Mleko); else
if(arg == "Ciastko") AddItem(Ciastko);

Nie wiem jak wykonać coś w stylu AddItem(Jablko) i żeby program automatycznie wiedział co dodać. Na szybko przychodzi mi do głowy tylko

Dictonary<string, Przedmiot>();
0

Aby mieć rozwiązanie unikalne, najlepiej byłoby wykorzystać tutaj refleksję (a jeśli nie ten mechanizm, to słownik - byle nie drabinkę ifów).
Przy czym, jak mniemam, dotyczy to sytuacji, gdy klient wysyła serwerowi pakiet z informacją o np. kupnie danego produktu - trzeba być uważnym, aby się nie zapędzić z refleksją wszędzie, łamiąc zasadę podstawienia Liskov.

1

nadal nie rozumiem.
Ktos zatwierdza oferte i chcesz zeby mu po prostu w ekwipunku sie dobrze dodaly?

Jezeli tak to rozwiazanie z Dictionary jest jak najbardziej na miejscu. mozesz miec jako drugi parametr List<Products> to wtedy bedziesz mogl je dodawac do listy

0

Czyli takie coś powinno działać?

abstract class Przedmiot{
	public string _Nazwa;
	public string _Opis;
}
class Miecz : Przedmiot{}
class Jablko : Przedmiot{}
class Core{
	Dictionary<string, Przedmiot> _Item = new Dictionary<string, Przedmiot>();
	List<Przedmiot> _EqGracz = new List<Przedmiot>();
	void main(){
		_Item.Add("Miecz", new Miecz());
		_Item.Add("Jablko", new Jablko());
		AddItem(_EqGracz, "Jablko");
	}

	void AddItem(List<Przedmiot> _Miejsce, string _Nazwa){
		_Miejsce.Add(_Item[_Nazwa]);
	}
}

w ogromnym uproszczeniu w sumie o takie coś mi chodzi

1

Jak już to:

Dictionary<string, List<Item>> items;

Daje Ci to możliwość trzymania w jednym miejscu kilku różnych przedmiotów. Jeżeli nie to było ideą to taki słownik jest niepotrzebny i starczy zwykła lista.

BTW: To co zrobiłeś też nie jest do końca dobre, bo wyszedł Ci taki wrapper na słownik. Zagmatwałeś za bardzo.
BTW2: Nazwenictwo też kiepskie. Poczytaj o regułach nazywania obiektów w C# to Ci to wiele wyjaśni.

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