Przekazywanie obiektu między klasami... w drugą stronę

0

Szukam dobrej praktyki w temacie... ale idźmy przykładu. Istnieje klasa nazwijmy ją Glowna, która przekazuje obiekty do Formularza za pomocą konstruktora. No i OK, działa jak powinno. Zastanawia mnie odwrotny scenariusz.

Otóż: Czy możliwa jest taka konstrukcja, że Formularz będzie mógł skorzystać z obiektów (Ob1, Ob2) na podstawie tego, że wywołała go metoda MakeIT z tej klasy (nic tu nie jest statyczne, chciałbym też uniknąć singletona) ??

public class Glowna
{
   private MojTyp1 Ob1;
   private MojTyp2 Ob2;

   public void MakeIT()
   {
      new Formularz(Ob1, Ob2).Show();
   }
}

//

public partial class Formularz : Form
{
   private MojTyp1 Ob1;
   private MojTyp2 Ob2;

   public Formularz(MojTyp1 _typ1, MojTyp2 _typ2)
   {
     Ob1 = _typ1;
     Ob2 = _typ2;

     InitializeComponent();
   }
}
2

Nie mam w zupełności pojęcia w czym jest problem.

0
pragmatyk napisał(a):

Szukam dobrej praktyki w temacie... ale idźmy przykładu. Istnieje klasa nazwijmy ją Glowna, która przekazuje obiekty do Formularza za pomocą konstruktora. No i OK, działa jak powinno. Zastanawia mnie odwrotny scenariusz.

Otóż: Czy możliwa jest taka konstrukcja, że Formularz będzie mógł skorzystać z obiektów (Ob1, Ob2) na podstawie tego, że wywołała go metoda MakeIT z tej klasy (nic tu nie jest statyczne, chciałbym też uniknąć singletona) ??

Czyli chciałbyś przenieść MakeIT do klasy Formularz?

1

po prostu przekaz ja do formuklarza za pomoca THIS, a ponad to zmien modyfikatory dostepu ;p

public class Glowna
{
   internal MojTyp1 Ob1;
   internal MojTyp2 Ob2;

   public void MakeIT()
   {
      new Formularz(Ob1, Ob2, this).Show();
   }
}

//

public partial class Formularz : Form
{
   private MojTyp1 Ob1;
   private MojTyp2 Ob2;
Glowna _glowna;
   public Formularz(MojTyp1 _typ1, MojTyp2 _typ2, Glowna glowna)
   {
     Ob1 = _typ1;
     Ob2 = _typ2;
_glowna = glowna;
_glowna
     InitializeComponent();
   }
}
1

zazwyczaj po prostu ustawiasz publiczne pole w formularzu a klasa wywołująca je sobie pobiera, popatrz na OpenFileDialog:

if (openFileDialog.ShowDialog() == DialogResult.OK)
{
    var fileName = openFileDialog1.FileName);
}

w ten sam sposób jak FileName możesz przekazać cały rekord z danymi. Raczej powiązanie dwustronne między Formularz a Glowna i przekazywanie instancji przez this to zły pomysł bo nie będziesz mógł tego formularza użyć gdziekolwiek indziej.
Jeżeli chcesz bez zamykania tylko w dowolnej chwili to możesz to zrobić przez eventy, tu znowu za przykład może służyć OpenFileDialog:

https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.filedialog.fileok?view=windowsdesktop-7.0

Możesz też działać bezpośrednio na instancjach MojTyp1 i zmieniać ich własności, nie można podmienić całej referencji, ale możesz to opakować w obiekt który będzie trzymał referencję zamiast trzymać samą referencję. Z tym że to też zły pomysł bo wtedy trudniej zrobić zwykłe "Anuluj".

0
heyyou napisał(a):

po prostu przekaz ja do formuklarza za pomoca THIS, a ponad to zmien modyfikatory dostepu ;p

public class Glowna
{
   internal MojTyp1 Ob1;
   internal MojTyp2 Ob2;

   public void MakeIT()
   {
      new Formularz(Ob1, Ob2, this).Show();
   }
}

//

public partial class Formularz : Form
{
   private MojTyp1 Ob1;
   private MojTyp2 Ob2;
Glowna _glowna;
   public Formularz(MojTyp1 _typ1, MojTyp2 _typ2, Glowna glowna)
   {
     Ob1 = _typ1;
     Ob2 = _typ2;
_glowna = glowna;
_glowna
     InitializeComponent();
   }
}

Trochę to namącone.
W kontekście działania to ruszy, ale w kontekście poprawności kodu to strasznie zagmatwane.
Za dużo zależności, tego typu zmienne powinny być przekazywane poprzez właściwości.
Chociaż mogę nie rozumieć koncepcji.

2

Szkoda dyskutować, OP zaginął.

Wszyscy zakładacie jakieś przypuszczenia, co poeta miał na myśli. Może listy do spadkobierców to kiedyś wyjasnią.
jak akurat mam jeszcze inną interpretację o co mu chodzi (nie w statyce, a w dynamice), ale to bez znaczenia

0

@ZrobieDobrze: przyszedłem "w pokorze" szukać dobrych praktyk.
Dostałem od Ciebie w zamian kilka poetyckich uwag rodem z Elektrody.
Jeśli chciałbyś powiedzieć coś w stylu: "Popatrz jakie to mądre" super, fajnie by było, prawdopodobnie wiesz co robisz, czapki z głów, etc.
Tymczasem widać jedynie "popatrz jaki jestem mądry". I to tyle.

1
pragmatyk napisał(a):

@ZrobieDobrze: przyszedłem "w pokorze" szukać dobrych praktyk.
Dostałem od Ciebie w zamian kilka poetyckich uwag rodem z Elektrody.
Jeśli chciałbyś powiedzieć coś w stylu: "Popatrz jakie to mądre" super, fajnie by było, prawdopodobnie wiesz co robisz, czapki z głów, etc.
Tymczasem widać jedynie "popatrz jaki jestem mądry". I to tyle.

Można pomóc w implementacji jak ktoś wie "co chce", ale nie ma pomysłu "jak"

A bez określenia się co do celu, bez przekazania jakie sie ma zarzuty / wątpliwości do "gorszego sposobu" i jaka by była miara "ulepszenia" ... niby w czym mam pomóc ?

Nie wiem czy przypadkowo moze zauważyłeś: nikt tu nie ma pewnego zrozumienia o co chodzi

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