Problem z przekazywaniem referencji, gdzieś jest przerwa (obiekt referencyjny zachowujący się jak nie referencyjny)

0

W ciągu przekazywania referencji mam jakąś dziurę, ale nie mogę jej zlokalizować, albo źle przekazuje te referencje, prosiłbym o pomoc w zlokalizowaniu co jest nie tak.

od PrezenteraOknaGlownego pcham do kolejnych obiektów referencje do obiektu typu "RegulaWalidacji ".
inicjalizuje ten obiekt dopiero w obiekcie "ObslugaPobieraniaZmapowanychProgramow" w jego metodzie " WykonajPolecenie(string odczytNrZlecenia)" spodziewam się ze od momentu inicjalizacji ten obiekt będę miał we wszystkich wymienionych obiektach w tym samym stanie, w którymkolwiek go zmienię, zmiana ta będzie widoczna w każdym innym który ma taka właściwość, ale tak nie jest.

  • zaznaczyłem w kodzie wszystkie miejsca gdzie postawiłem BreakPointa,
  • dodałem wszystkie kolejne referencje "RegulaWalidacji" (wszystkie właściwości tego typu) w każdym z tych obiektów poniżej do okna Watch w VisualStudio żeby podglądać ich zawartość wartości
  • ustawiają się w kolejności zgodnie z wywołaniami konstruktorów:
    PresenterOknaGlownego
    PresenterWalidacji
    ObslugaPobieraniaZmapowanychProgramow
    ObslugaPobieraniaProgramowZZapisow
    ObslugaWalidowaniaDopasowaniaWersji
    ManagerPolecenWalidacji
  • następnie wywołuje metodę z obiektu: ObslugaPobieraniaZmapowanychProgramow.WykonajPolecenie(string odczytNrZlecenia) w której inicjuje ten obiekt i zaczynam go ustawiać danymi,
  • następnie chce wykonać metodę z kolejnego obiektu: ObslugaPobieraniaProgramowZZapisow.WykonajPolecenie(string odczyt) w której "dokładam" kolejne dane do typu "RegulaWalidacji" ale tu już wywala wyjątek ze "BiezacaRegulaPolZap" jest null i nie ma się do czego odwołać żeby ustawić jego kolejne właściwości.

Co robię nie tak z tymi referencjami?

screenshot-20211206212305.png

public class PresenterOknaGlownego
    {
        //(...)
        public RegulaWalidacji BiezacaRegulaPresGlowny { get; set; }
        public DaneWyrobuPakowanego WybranyArtykulDoPakowania { get; set; }
        //(...)

        public PresenterOknaGlownego(IWidokOknaGlownego view)
        {
            this.view = view;
            ManagerDrukowania = new ManagerPolecenDrukowania(this);

            //(...)
        } //TUTAJ JEST BREAKPOINT
        //(...)
}
 public class PresenterWalidacji
    {
        //(...)
        private readonly IWidokWalidacjiWersjiProgramu viewWalidacji;
        public PresenterOknaGlownego PresenterOknaGlownego { get; private set; }
        public DaneWyrobuPakowanego PakowanyArtukulOWWP { get; set; }
        public ManagerPolecenWalidacji ManagerWalidacji { get; private set; }

        public RegulaWalidacji BiezacaRegulaPrezWalidacji { get; set; }

        public PresenterWalidacji(IWidokWalidacjiWersjiProgramu view, PresenterOknaGlownego mainPresenter)
        {
            this.viewWalidacji = view;
            this.PresenterOknaGlownego = mainPresenter;
            PakowanyArtukulOWWP = PresenterOknaGlownego.WybranyArtykulDoPakowania;
            BiezacaRegulaPrezWalidacji = PresenterOknaGlownego.BiezacaRegulaPresGlowny;

            ManagerWalidacji = new ManagerPolecenWalidacji(this);
        }//TUTAJ JEST BREAKPOINT
        //(...)
}
public class ManagerPolecenWalidacji
    {
        private WykonawcaPolecenWalidacji walidator;
        public RegulaWalidacji BiezacaRegulaManagerPolecen { get; private set; }

        public ManagerPolecenWalidacji(PresenterWalidacji presenter)
        {
            walidator = new WykonawcaPolecenWalidacji();
            walidator.ZdefiniujObslugeWalidacji(TypRozkazuEnum.OdczytNrZlecenia, new ObslugaPobieraniaZmapowanychProgramow(presenter));
            walidator.ZdefiniujObslugeWalidacji(TypRozkazuEnum.OdczytUID, new ObslugaPobieraniaProgramowZZapisow(presenter));
            walidator.ZdefiniujObslugeWalidacji(TypRozkazuEnum.WalidatorProg, new ObslugaWalidowaniaDopasowaniaWersji(presenter));

            BiezacaRegulaManagerPolecen = presenter.BiezacaRegulaPrezWalidacji;
        }//TUTAJ JEST BREAKPOINT

        public void PrzekazDoWykonania(string odczytWartosc)
        {
            walidator.RozkodujIWykonaj(odczytWartosc);
        } 
    }
    public class ObslugaPobieraniaZmapowanychProgramow : ObslugaWalidacjiBase, IPolecenieWalidacji
    {
        //(...)
        private DaneWyrobuPakowanego pakowanyArtykul;
        private PresenterWalidacji presenterOWWP;

        public RegulaWalidacji BiezacaRegulaPolMap { get; private set; }

        public ObslugaPobieraniaZmapowanychProgramow(PresenterWalidacji presenter)
        {
            //(...)
            this.presenterOWWP = presenter;
            pakowanyArtykul = presenter.PakowanyArtukulOWWP;
            BiezacaRegulaPolMap = presenter.BiezacaRegulaPrezWalidacji;
        }//TUTAJ JEST BREAKPOINT

        public void WykonajPolecenie(string odczytNrZlecenia)
        {
            //(...)
            //TUTAJ NASTEPUJE PIERWSZA INICJALIZACJA OBIEKTU
            BiezacaRegulaPolMap = new RegulaWalidacji(pakowanyArtykul.NrZlecenia, pakowanyArtykul.Index);
            foreach (var item in ZwrocZmapowaneProgramyDoIndexu(pakowanyArtykul.Index))
            {
                BiezacaRegulaPolMap.DodajProgramZ_Mapowania(new DaneProgramu(item.NazwaPlikuProgramu));
            }
            //(...)
        } 
        //(...)
}
    public class ObslugaPobieraniaProgramowZZapisow : ObslugaWalidacjiBase, IPolecenieWalidacji
    {
        //(...)
        public RegulaWalidacji BiezacaRegulaPolZap { get; private set; }

        private PresenterWalidacji presenterOWWP;

        public ObslugaPobieraniaProgramowZZapisow(PresenterWalidacji presenter)
        {
            //(...)
            this.presenterOWWP = presenter;

            BiezacaRegulaPolZap = presenter.BiezacaRegulaPrezWalidacji;
        }//TUTAJ JEST BREAKPOINT
        //(...)
}
public class ObslugaWalidowaniaDopasowaniaWersji : ObslugaWalidacjiBase, IPolecenieWalidacji
    {
        private PresenterWalidacji presenterOWWP;
        public RegulaWalidacji BiezacaRegulaPolWal { get; set; }

        public ObslugaWalidowaniaDopasowaniaWersji(PresenterWalidacji presenter)
        {
            this.presenterOWWP = presenter;
            BiezacaRegulaPolWal = presenter.BiezacaRegulaPrezWalidacji;
        }//TUTAJ JEST BREAKPOINT
        //(...)
}
0

Miałem chyba chaotyczny opis sytuacji, myślę ze teraz jest czytelniejszy. Prosiłbym o pomoc - zwyczajnie się już zakręciłem i najprawdopodobniej nie widzę swojego prawdopodobnie czeskiego błędu.

0

Poczytaj o ref i out , w szczególnosci o tym pierwszym.

e: dobra, widze ze tu jednak w czym innym problem
robisz:

 BiezacaRegulaPolMap = presenter.BiezacaRegulaPrezWalidacji;

potem:

BiezacaRegulaPolMap = new RegulaWalidacji(pakowanyArtykul.NrZlecenia, pakowanyArtykul.Index);
          ```

i oczekujesz ze pod ```presenter.BiezacaRegulaPrezWalidacji``` magicznie sie podmieni na ten obiekt który przed chwilą utworzyłeś? No tak to nie działa, tam nadal bedziesz mial te wartość sprzed utworzenia obiektu.
0

@kzkzg: bardzo podobnie, wręcz analogicznie przepycham obiekt typu "Dane pakowanego artykułu" przez parę obiektów, raz inicjalizuje i wszędzie mam go dostępnego zawsze w aktualnym stanie. Jedyna różnica to to że teraz mam tę referencje w obiektach w słowniku, nie wiem co się tam dzieje przy wywoływaniu obiektu ze słownika.

0

dobra, prosciej sie nie da:

string a = "hello";
var b = a;
b="changed";
Console.WriteLine(a); //hello

Tam robisz dokladnie to samo.

0

no nie do końca Ty pokazujesz typ prosty string a ja mam referencyjny, oczekuje takiej analogi jak nizej.

class CośTam
    {
        public int wartosc;
        public CośTam(int a)
        {
            wartosc = a;
        }
    }

class Program
    {
        static void Main(string[] args)
        {
            CośTam coś1 = new CośTam(5);
            CośTam coś2 = coś1;

            coś2.wartosc = 2;
            Console.WriteLine(coś1.wartosc);    //wynik wyświetlany 2.

            Console.ReadLine();
        }
}

0

@kzkzg:
Mi przy tym kodzie działa jak należy w sensie nie mam null nigdzie na TestRef mimo ustawienia w ostatniej klasie

namespace ConsoleApp1
{
    class Program
    {        
        static void Main(string[] args)
        {

            var main = new MainWindow();       
        }

    }
    class MainWindow
    {
        public TestRef Test { get; private set; }
        public MainWindow()
        {
            var first = new First(this);
        }
    }
    class TestRef
    {        
    }

    class First
    {
        public First(MainWindow main)
        {
            Test = main.Test;
            var second = new Second(this);
            second.Init();
        }
        public TestRef Test { get; set; }

    }

    class Second
    {
        public Second(First first)
        {
            Test = first.Test;
        }
        public TestRef Test { get; set; }
        public void Init() { Test = new TestRef(); }
    }
}

@Varran Być może problem jest gdzieś w implementacji której nie pokazałeś

0

@szydlak: no coż, pewnie mam cos popsute.
screenshot-20211206224056.png

0
kzkzg napisał(a):

@szydlak: no coż, pewnie mam cos popsute.

hmm, tzn powiem szczerze, że mi na quick watch pokazywalo wszystkie wartości. Ale jak wyszło z metody init to wszędzie jest null

0

Tylko w ostatnim się ustawia w moim kodzie. Zbyt szybko człowiek chciał sukces ogłosić :P.

0

Temat ogarnięty. Czeski błąd polegał na tym że próbowałem przekazywać referencje null'a do najgłębszego poziomu. A żeby móc przekazywać referencje musi być obiekt a nie null. Więc utworzenie pustego obiektu w prezenterze głównym i zastąpienie inicjacji tego samego obiektu w poleceniu na rzecz tylko ustawiania jego właściwości w tym poleceniu, całkowicie rozwiązało problem.

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