Problem z klasa wewnetrzna

0

Witam,

Chce napisac liste dwukierunkowa. Napisalem taki kod:

public class List
{
    public void dodaj(int wartosc)
    {
        if (this.pierwszy == null)
        {
            this.pierwszy = new Element(wartosc);
            this.ostatni = this.pierwszy;
        }
        else
        {
            Element pomocniczy = new Element(wartosc);
            this.ostatni.Nastepny = pomocniczy;
            pomocniczy.Poprzedni = this.ostatni;
            this.ostatni = this.ostatni.Nastepny;
            this.ostatni.Nastepny = null;
        }
    }

    private Element pierwszy;
    public Element Pierwszy
    {
        get { return pierwszy; }
        set { pierwszy = value; }
    }
    private Element ostatni;

    class Element
    {
        public Element(int wartosc)
        {
            this.wartosc = wartosc;
        }

        private Element poprzedni;
        public Element Poprzedni
        {
            get { return poprzedni; }
            set { poprzedni = value; }
        }

        private Element nastepny;
        public Element Nastepny
        {
            get { return nastepny; }
            set { nastepny = value; }
        }

        private int wartosc;
    }
}

Powyzszy kawalek doku znajduje sie w pliku Lista.cs . W glowym projekcie tworze obikt typu List, a nastepnie dodaje element. I tutaj zaczyna sie problem ... a mianowicie ... powyzszy kod jest nieprawidlowy poniewaz klasa wewnetrzna ma "nizszy" modyfikator niz wlasciwosci Pierwszy. Jakie jest wyjscie z tej sytuacji? na pewno jednym z nich jest dostawienie modyfikatora public do klasy wewnetrznej, ale czy to nie jest lamanie enkapsulacji?

0

Możesz stworzyć klasę abstrakcyjną, którą klasa Element będzie implementować. Wtedy te właściwości, które zwracają obiekt klasy Element, powinny być zadeklarowane jako zwracające obiekt tego typu abstrakcyjnego.

0

użyj klasy ArrayList

masz gotową listę dwukierunkową z dostępem przez indexator

0

Napisał, że używa generycznego List<T> - więc ArrayList już niepotrzebny.

0

Wlasnie o to chodzi zebym nie uzywal zadnych wbudowanych kontenerow. Ale czy deklarowanie klasy wewnetrznej jako klasy publicznej jest lamaniem enkapsulacji?

0

Klasa wewnętrzna może się nam w naturalny sposób kojarzyć z klasą niepubliczną jednak nigdzie nie widziałem jakiś zakazów ani zaleceń co do tego, że nie można jej w razie potrzeby oznaczać jako publiczna.

Poza tym cała ta enkapsulacja należy tylko do tzw. paradygmatów programowania obiektowego, a jak wiesz paradygmat nie jest dany raz na zawsze tylko jest przyjęty na zasadzie konsensusu. Inaczej rzecz ujmując: zasady są po to aby je łamać :P

IMHO o tym czy coś powinno być ukryte przed użytkownikiem powinien decydować zdrowy rozsądek, a nie jakieś zasady, które przecież mogą jakiejś sytuacji nie przewidzieć.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.