Enumerator dla klasy generycznej

0

Mam sobie 3 klasy: BinaryTreeNode, BST i BSTdfs, wszystkie generyczne. BST jest kolekcją elementów, BSTdfs ma w zamierzeniu dodawać możliwość iterowania po drzewku BST w porządku preorder.


class BinaryTreeNode<T>
    {
        public T key;
        public BinaryTreeNode<T> left, right, up; 
    }

class BST<T> where T : IComparable<T>
    {
         //tu implemntacja bst która jest OK

    }

class BSTdfs<T> : BST<T>, IEnumerable<T>,IEnumerator<T> where T : IComparable<T>
    {
        protected Stack<BinaryTreeNode<T>> S;

        public BSTdfs()
        {
            S = new Stack<BinaryTreeNode<T>>();
        }

        public IEnumerator<T> GetEnumerator()
        {
            return (IEnumerator<T>)this;
        }

        public bool MoveNext()
        {
            var curr = S.Pop(); 

            if (curr.right != null)
                S.Push(curr.right);

            if (curr.left != null)
                S.Push(curr.left);

            return S.Count() != 0;
        }

        public void Reset()
        {
            S.Push(root);
        }

        public object Current
        {
            get
            {
                return S.Peek().key;
            }
        }

    }



Kod się nie kompiluje, tzn. wyrzuca mi komunikaty:

  • doesn't implement interface member IDispose.Disopse() (wtf?)
  • Current doesn't have matching return type of T (tutaj zmieniając typ current z object na T dotaje analogiczny kominikat tylko have matching return type of object)
  • GetEnumerator doesn't have matching return type of IEnumerator (kolejne wtf?)

Generalnie mało w sieci jest na temat implementacji IEnumerable, ja korzystałem z tych porad:
<url> http://www.c-sharpcorner.com/UploadFile/prasadh/Enumerators11132005232321PM/Enumerators.aspx </url>

0

Radzę patrzeć na daty artykułów. W 2001 nie było jeszcze słówka yield na przykład.

0

masz zle zaimplemetowany interfejs
VS ma taka fajna funkcjonalnosc ze w menu kontekstowym pokazuje opcje zaimplementuj jawnie/niejawnie interfejs
zaimplementuj poprawnie interfejsy i bedzie ok (czyli mam na mysli wszystkie walsciwosci i metody) albo przeczytaj msdn

0

Wywal ten kod, bo wygląda archaicznie. Poszukaj informacji o "yield return".

0

Sytuacja wygląda tak, że musze naklepać iterowanie po drzewie za pomocą enumeratorów w dwóch wariantach: ze słowem yield i bez niego. Na pierwszy ogień poszedł drugi sposób, z yieldem jeszcze nie próbowałem.

przeczytaj msdn

Skopiowałem pierwszy przykład do VS2010 stąd http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx
i najśmieszniejsze jest to że również nie chciało się skompilować (krzyczał nie wiem czemu że wymaga IEnumerable<Person> więc dodałem te Person i wysypuje podobne komunikaty jak mi)

Co do tego całego IDispose to w ogóle nie czaje po co mam wykorzystywać ten interfejs, ja nie chce żadnych cudów (zresztą bst samo w sobie już działa, nie widze miejsca w którym musiałbym coś zwalniać), potrzebne mi zwykłe przeglądanie drzewka pętlą for each.

Szczerze mówiąc to nie spodziewałem się takich podchodów z tymi enumeratorami, no nic jak nie będzie wyjścia to naklepie tylko wariant z yieldem.

EDIT: Fakt, z yieldem bardzo przyjemnie się pisze, ale nadal jestem ciekaw co jest nie tak w konstrukcji podanej przeze mnie. Może ktoś wie?

0

bede troche niemily, bo jednak jestes ignorantem i nie zapoznales sie z tym co masz zrobic, wiec jak dziecku, jesli chcesz zaimplementowac interfejs, to nalezy zaimplementowac wszystkie jego metody i wlasciwosci, jesli tego nie wiesz, doucz sie, a pozniej zacznij programowac, albo sobie odpusc
i chyba wielce magicznej funkcji VS generujacej wszystkie metody i wlasciwosci interfejsu do zaimplemntowania tez nie odkryles o_O
wiec z IDispose nie chodzi o to ze MUSISZ cos zwlaniac, ale ty chcesz zaimplementowac interfejs IEnumerator<T>, ktory dziedziczy po IDispose i IEnumerator i wyobraz sobie ze MS byl na tyle przebiegly, ze napisal to w msdn http://msdn.microsoft.com/en-us/library/78dfe2yb.aspx

0

zebys nie kopal nie wiem ile na google za tym..

chyba wielce magicznej funkcji VS generujacej wszystkie metody

public class WTF : Baza, IInterfejs1, IInterfejs2, IInterfejs33
{ ....

visual podkresla NIEdopimplementowany interfejs na czerwono. kliknij NA TYMŻE interfejsie prawym przyciskiem. w menu ktore wyskoczy znajdziesz dwie opcje:
implement interface >>
implement interface explicitly >>

ktore wygeneruja Ci szkielet brakujacych metod, ktore dany interfejs definiuje

ba, ten sam trick tyczy sie abstrakcyjnych klas bazowych. tylko opcja w menu nazywa sie inaczej

ps. i jak bedziesz czytal zawartosc linku podanego przez massthera, przeczytaj tez te 2 ode mnie, gdyz kiedys potkniesz sie o inne Dispose -- Dispose(bool), i lepiej, zebys wiedzial czym ono sie rozni

0

@massther No fakt, należała mi się zjebka bo twoja porada rzeczywiście rozwiązuje mój problem, trochę się spieszyłem i olałem to co napisałeś [glowa] . Z drugiej strony dopiero zaczynam się bawić Visual-em i w ogóle NET-em, nie wiedziałem że ma takie bajery.

W każdym razie dziękuje Panowie za pomoc.

0

generalnie VS to chyba najlepsze IDE (Integrated Development Environment)
ma sporo opcji i skrotow, ktore pomagaja w klepaniu, ze nie wspomne o intelli sense
niezlym pomyslem jest tez zainstalowanie ReSharpera, wersje night build sa za darmo, oczywiscie maja bugi i czasem niektore zawieszaja VS, ale warto
http://confluence.jetbrains.net/display/ReSharper/ReSharper+5.1+Nightly+Builds

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