Liczba instancji klasy zagniezdzonej

0
         public class TreeList
        {
            private int mainitemsCount;

            public class MainItem
            {
                private string title;

                public string Title
                {
                    set { this.title = value; }
                    get { return title; }
                }

                public MainItem()
                {
                    //z tego miejca chce zwiekszyc pole mainItemsCounts, (mainItemsCounts++)
                    // title="MainItem"+mainItemsCounts.ToString();
                }
            }

Lecz nie moge sie dostac do pola mainItemsCounts z wskazanego miejsca, wdaczego?

0

Albowiem próbujesz się dostać do prywatnego składnika innej klasy. Nie pomaga tutaj, że miejsce, o którym mówisz należy do klasy zagnieżdżonej - inna klasa to inna klasa i wara od prywatnych składników.

0

no tak, nie dalem calego przykladu, w oryginale uzylem wlasciwosci, i tez nie idzie

        public class TreeList
        {
            private int mainitemsCount;

            public class MainItem
            {
                private string title;

                public string Title
                {
                    set { this.title = value; }
                    get { return title; }
                }

                public MainItem()
                {
                    //z tego miejca chce zwiekszyc pole mainItemsCounts, (mainItemsCounts++)
                    // title="MainItem"+ MainItemCount.ToString();
                }
            }
            public int MainItemCount
            {
                get { return mainItemCount; }
            }
       }
0

mainitemCounts jest polem prywatnym klasy TreeList.

MainItemCount jest właściwością tylko do odczytu klasy TreeList.

Więc jakim cudem chcesz zmienić wartość tego pola z zupełnie innej klasy MainItem?
Dodaj akcesor set do właściwości, albo zmień dostęp pola na internal bądź public.

P.S. Po co zagnieżdżasz klasy?

0

Albowiem będąc w klasie możesz odwołać się do składnika innej (tutaj nadrzędnej) klasy tylko przez konkretną instancję typu - obiekt. Wyjątkiem są składniki statyczne, które istnieją niezależnie od instancji.

Jeśli to jest niezrozumiałe, to przeanalizuj kawałek kodu

... // załóżmy, że TreeList.MainItemCount ma zarówno get jak i set

TreeList tl1 = new TreeList();
tl1.MainItemCount = 1;

TreeList tl2 = new TreeList();
tl2.MainItemCount = 2;

TreeList.MainItem mi = new TreeList.MainItem();
...

Jaka liczba Twoim zdaniem powinna być odczytana w konstruktorze w zmiennej mi ?

0
Hass napisał(a)

Albowiem będąc w klasie możesz odwołać się do składnika innej (tutaj nadrzędnej) klasy tylko przez konkretną instancję typu - obiekt. Wyjątkiem są składniki statyczne, które istnieją niezależnie od instancji.

Jeśli to jest niezrozumiałe, to przeanalizuj kawałek kodu

... // załóżmy, że TreeList.MainItemCount ma zarówno get jak i set

TreeList tl1 = new TreeList();
tl1.MainItemCount = 1;

TreeList tl2 = new TreeList();
tl2.MainItemCount = 2;

TreeList.MainItem mi = new TreeList.MainItem();
...

Jaka liczba Twoim zdaniem powinna być odczytana w konstruktorze w zmiennej mi ?

Zadna, skoro nawet przy uzyciu akcesorw get i set nie moge sie dostac do wlasciwosci MainItemscount, proba inkrementacki wygereruje blad kompilatora z powodu braku dostepu ;)

0

Dokładnie. A chciałbyś, żeby co się stało?

0

Czyli nie ma mozliwośći dostania sie do zmiennej w sposob jaki chcialem to zrobic w poscie pierwszym? A metoda na obejscie tego?

0

Mówiąc krótko - C# to nie Java. Nie wszystko w C# musi być identyczne jak w Javie.
W Javie bez problemu dostaniesz się z wewnętrznej klasy do prywatnej zmiennej klasy zewnętrznej, natomiast w C# wpierw musisz stworzyć instancję klasy zewnętrznej, a dopiero później będziesz mógł się dostać do wszystkich zmiennych (nawet prywatnych) tej klasy.
W konstruktorze klasy wewnętrznej MainItem wpisz wpierw:
TreeList tl = new TreeList();
I dopiero teraz będziesz mógł dostać się do zmiennych prywatnych klasy TreeList:
tl.mainitemsCount++

Jak już wcześniej wspomniałem C# to nie Java choć oba języki mają wiele wspólnych cech. W Javie nie można przeciążać operatorów, a w C# można. W Javie i w C# można dziedziczyć tylko po jednej klasie i implementować wiele interfejsów. Natomiast dostęp do zmiennych klasy zewnętrznej z klasy wewnętrznej w obu językach jest inny.
Ciekawą właściwością języka C# są klasy częściowe. Polega to na tym, że jedną klasę można zdefiniować w kilku plikach. Więcej informacji znajdziesz tutaj:
link
Ten mechanizm jest stosowany w ASP.NET.
W Javie z czymś takim się nie spotkałem.

0
Igor1981 napisał(a)

Mówiąc krótko - C# to nie Java. Nie wszystko w C# musi być identyczne jak w Javie.
W Javie bez problemu dostaniesz się z wewnętrznej klasy do prywatnej zmiennej klasy zewnętrznej, natomiast w C# wpierw musisz stworzyć instancję klasy zewnętrznej, a dopiero później będziesz mógł się dostać do wszystkich zmiennych (nawet prywatnych) tej klasy.
W konstruktorze klasy wewnętrznej MainItem wpisz wpierw:
TreeList tl = new TreeList();
I dopiero teraz będziesz mógł dostać się do zmiennych prywatnych klasy TreeList:
tl.mainitemsCount++

Jak już wcześniej wspomniałem C# to nie Java choć oba języki mają wiele wspólnych cech. W Javie nie można przeciążać operatorów, a w C# można. W Javie i w C# można dziedziczyć tylko po jednej klasie i implementować wiele interfejsów. Natomiast dostęp do zmiennych klasy zewnętrznej z klasy wewnętrznej w obu językach jest inny.
Ciekawą właściwością języka C# są klasy częściowe. Polega to na tym, że jedną klasę można zdefiniować w kilku plikach. Więcej informacji znajdziesz tutaj:
link
Ten mechanizm jest stosowany w ASP.NET.
W Javie z czymś takim się nie spotkałem.

Ale ja nie chce tworzyc obiektow TreeList przy kazdorazowym zuyciu konstruktora MainItem();

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