C# - dziedziczenie

0

Witam!
Mam taki kod:

public class A
      {
         private ObservableCollection<Word> ListOfWords = new ObservableCollection<Word>();
         
         //...
         
         virtual public Word RandomWord() 
         {
           //...
         }
      }
public class B : A
     {
            private ObservableCollection<Word> ListOfWordsForTest = new ObservableCollection<Word>();
            
            public B(ObservableCollection<Word> collection)   //konstruktor
              {
                 ListOfWordsForTest = collection ;
              }

            //...

            override public Word RandomWord()
            {
               //...
            }
      }
public partial class MainWindow : Window
       {
                public A classA = new A();
                 public B classB;
                 
                 public MainWindow()
                 {
                   ObservableCollection<Word> collect = A.ListOfWords; 
                    classB = new B(collect);
                 }
                
                 //...
                 
                 randWord = B.RandomWord();
                 
       }

W klasie A tworzę kolekcję o nazwie ListOfWords i wypełniam ją jakimiś elementami. W klasie B również tworzę taką kolekcję o nazwie ListOfWordsForTest (klasa B dziedziczy po klasie A). W MainWindow przypisuję do konstuktora klasy B obiekt, który przechowuje zawartość kolekcji ListOfWords z klasy A, a w konstruktorze klasy B jest on przypisywany do ListOfWordsForTest. Metoda RandomWord() z klasy B zwraca wylosowany element listy i od razu go usuwa. Problem polega na tym, że gdy kasuję element z kolekcji ListOfWordsForTest to usuwa się również ten element z kolekcji ListOfWords. W jaki sposób mogę zrobić usuwanie tylko z listy znajdującej się w klasie B a lista z klasy A żeby była nie ruszona?

1

ObservableCollection to typ referencyjny a zatem przekazywany jest przez referencje. Przekaz do konstruktora klasy B nowa liste wypelniona zawartoscia starej listy.
classB = new B(new ObservableCollection<Word>(collect));

0

Teraz działa :) Dzięki wielkie za pomoc.
Jeszcze mam takie pytanie. Jeżeli chcę odziedziczyć wszystko z klasy bazowej to wszystkie pola, metody itp w tej klasie muszą być publiczne? Nie ma możliwości dziedziczenia elementów prywatnych?

1

Niekoniecznie. Mozesz uzyc modyfikatora dostepu protected zamiast private.
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/protected

0

A tak swoją drogą, to po co usuwasz ten element z listy zamiast po prostu zapamiętać gdzieś, że został już użyty?

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