Witam. trafiłem na takie zadanie: A tutaj jest jego kontynuacja: . Udało mi się stworzyć pierwszą czesc zadania, ale w drugiej się pojawiają schody. Prosiłbym, aby ktos mógł ocenic poziom tego zadania i wytłumaczył mi jak zaimplementować interfejs IEanumerable<T> ,dlaczego w konstruktorze? miałem problem z implementacją ICloneable ,ale nie wiem czy w końcu jest ok? bo działać działa, ale bardzo długo się meczyłem bo myslałem ,ze trzeba zrobić tzw "Głębokie kopiowanie" a ,gdy już siły nie miałem to się okazało ,ze wystarczyło płytkie i tego też nie rozumiem. Dostałem wskazówkę od kolegi, aby składowe klasy ,które reprezentują stan obiektu deklarować w osobnej klasie niż metody, które wykonują operacje na nich (proszę o komentarz) . Klasa druzyna:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace RPG
{
class Druzyna : ICloneable
{
private List<IPostac> druzyna;
private string nazwa;
// dodaj konstruktor przujmujący w argumencie kolekcję IEnumerable<IPostac>,
//zaimplementuj interfejs IEnumerable<T>, tak aby możliwe było iterowanie elementów drużyny za pomocą pętli foreach,
public Druzyna(string n)
{
nazwa = n;
druzyna = new List<IPostac>();
}
public void Dodaj(IPostac p)
{
druzyna.Add(p);
}
public int Suma()
{
int moc = 0;
foreach (IPostac item in druzyna)
{
moc += item.Moc();
}
return moc;
}
public IEnumerator GetEnumerator()
{
return druzyna.GetEnumerator();
}
public void Wyswietl()
{
foreach (IPostac item in druzyna)
{
Console.WriteLine(item.ToString());
}
}
public object Clone()
{
return MemberwiseClone();
}
}
}
Przepraszam za taki burdel w kodzie. Jak będzie trzeba to postaram sie troche posprzatac:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace RPG
{
class Program
{
static void Main(string[] args)
{
Mag m1 = new Mag();
Console.WriteLine(m1.pkt(-45));
Console.WriteLine(m1.ToString());
Console.WriteLine(m1.pkt(5));
Console.WriteLine(m1.ToString());
Console.WriteLine("-----------------\n");
Mag m2 = new Mag("Michal", 66, 23);
Console.WriteLine(m2.ToString());
Console.WriteLine("-----------------\n");
Wojownik w = new Wojownik();
w.pkt(5);
Console.WriteLine(w.ToString());
Mag bohater1 = new Mag();
Mag bohater2 = new Mag("xyz", 10, 5);
Wojownik bohater3 = new Wojownik();
Wojownik bohater4 = new Wojownik("kamil", 10);
Console.WriteLine("\nTworze druzyne\n");
Druzyna druzyna = new Druzyna("Druzyna pierscienia");
druzyna.Dodaj(bohater1);
druzyna.Dodaj(bohater2);
druzyna.Dodaj(bohater3);
druzyna.Dodaj(bohater4);
// druzyna.Wyswietl();
Console.WriteLine("\nMoc druzyny: ------------------------");
Console.WriteLine(druzyna.Suma());
Console.WriteLine("\n");
foreach (IPostac item in druzyna)
{
Console.WriteLine("Imie: {0}", item.Nazwa);
Console.WriteLine(item);
}
Console.WriteLine("\n");
Console.WriteLine("\n");
//IEnumerator i = druzyna.GetEnumerator();
//i.MoveNext();
//Mag m = (Mag)i.Current;
//Console.WriteLine("Imie : {0},moc {1}", m.Nazwa, m.Sila);
Console.WriteLine("Nowa sklonowana drużyna:");
Druzyna x;//= new Druzyna("Klon");
x= (Druzyna)druzyna.Clone();
foreach (IPostac item in x)
{
Console.WriteLine(item);
}
if(Object.ReferenceEquals(druzyna, x))
Console.WriteLine("Referencje odwołuja się do tego samego obiektu");
else
Console.WriteLine("Referencje nie odwołuja się do tego samego obiektu"); //To zostaje wykonane
//Coś takiego mi się wczesniej pokazywało????===>> System.InvalidCastException: „Nie można rzutować obiektu typu 'System.Collections.Generic.List`1[RPG.IPostac]' na typ 'RPG.Druzyna'.”
Console.ReadKey();
}
}
}