Własna kolekcja na podstawie ArrayList i problem z Clone()

0

Witam, zrobiłam sobie własną kolekcje na bazie klasy ArrayList, wszytsko dziala prawie ok, prawie bo gdy korzystam z Clone() w rezultacie otrzymuje NULL, i nie wiem gdzie robię błąd

znacznikArrayList tmp = new znacznikArrayList();

//...
//tu operacje wykonywane na Tmp, które jak sprawdziłam
// w efekcie zmieniają tmp, także nie ma siły żeby tmp było NULL
//...

ListaZnacznikAL.Add(tmp.Clone() as znacznikArrayList);

kiedy zastąpię linijkę powyżej

ListaZnacznikAL.Add(tmp);

Wszystko działa ok, co jest kolejnym dowodem na to że z tmp jest teoretycznie wszystko ok, poniżej kod mojej kolekcji

public class znacznikArrayList : System.Collections.ArrayList
    {
        public new znacznik this[int index]
        {
            get { return ((znacznik)base[index]); }
        }

        public int Add(znacznik zn)
        {
            return base.Add(zn);
        }

        public void Insert(int index, znacznik zn)
        {
            base.Insert(index, zn);
        }

        public void Remove(znacznik zn)
        {
            base.Remove(zn);
        }


        public bool Contains(znacznik zn)
        {
            return base.Contains(zn);
        }

    }

z góry dzieki za wszelką pomoc

0

zaimplementuj interfejs ICloneable

0

No ale na czym, na składniku zaimplementowanej prze zemnie arraylisty czy na samej arrayliście, czy to że użyłam za bazę ArrayList nie robi tego z automatu?

0

Z tego co zauważyłem próbujesz w parametrze Add(...) podać całą kolekcję ? (czy się mylę? ). - po co?

  1. ICloneable oczywiście do twojej klasy (kolekcji). Pytanie tylko po co Ci Clone() dla całej kolekcji?? - może pomyliłaś się? Ponieważ ArayList operuje tylko! na klasie System.Object - należy obsłużyć głębokie klonowanie.

  2. Nie używaj ArrayList- to jest 'archaizm' jeszcze z czasów .NET wersji 1.0. Zauważ, że z każdą operacją na elemencie listy robisz boxing / unboxing - trwa to trochę czasu. Dla kilkuset tysięcy elementów będzie różnica. Użyj typów generycznych Klasa<Typ>

  3. Jeśli to ma być kolekcja z prawdziwego zdarzenia - zaimplementuj też ICollection<T>, IEnumerable<T>, może też IList<T> oraz ich "nie generyczne" poprzedniki.

0

ogólnie zinterface-ów jestem zielona, fajnie by było jakbyś mnie ciutke bardziej naprowadził

Nie pomyliłam się Elemntów max w każdej ArrayLiście 12, no a dodaje całą arryaliste bo jest to mi akurat potrzebne, poprzednio było to

List<znacznik> ListaZnaczik = new List<znacznik>();
List<List<znacznik>> ListaListaZnacznik = new List<List<znacznik>>();

Ale nie mogłam poradzić sobie z usunięciem referencji, więc uderzyłam w ArrayList, a żeby nie bawić sie wprowadzanie zmian odnośnie rzutowania postanowiłam zrobić taką własną kolekcje w oparciu o ArrayList. Jak możesz to powiedz co zrobić w przypadku gdy mam definicje kolekcji jak powyżej.

I jeśli możesz napisz o co biega z tym głębokim klonowaniem i jak to zaimplementować

0

Plytkie kopiowanie - kopiowane sa tylko wartosci. Jezeli cos jest referencja to referencja jest kopiowana a nie caly obiekt. Przez co moze np masz dwie listy ale maja one te same obiekty. Czyli zmieniasz obiekt w jednej liscie - w drugiej takze jest zmieniony.

Glebokie kopiowanie - kopiowane sa cale obiekty, a nie tylko ich referencje. Mielibysmy wtedy dwie listy i kazda lista by miala swoje obiekty, ktore by nie zalezaly od drugiej listy.

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