Przesylanie danych miedzy klasami

0
namespace projekt
{
    class klasaA
    {
	public int[] ZwocTabele()
	{
	...
	return table;	
	}
    }
}

namespace projekt
{
    public partial class Form1 : Form
    {
	private void Form1_Load(object sender, EventArgs e)
        {
            klasaA ka = new klasaA();
            FillGrid(ka.ZwrocTabele());
        }
	
	private void SprawdzTabele()
	{
		?????????
	}
    }
}

Takie oto pytanie.
Utworzylem sobie klase KlasaA, w ktorej w paru funkcjach generuje jakas tam tablice. Klasa zwraca funkcja ZwrocTabele porzadana tablice. W glownej klasie projektu (tu akurat Forma) wczytuje sobie ta tablice na grida. Wszystko jest Ok. Pod koniec tworzenia projektu zaszla potrzeba ponownego odczytania tej pierwotnej tablicy. Nie wiem jak to zrobic, jak zaimplementowac funkcje SprawdzTabele(). Wiem, ze moglbym KlasaA zdefiniowac jako statyczna i dodac statyczna zmienna reprezentujaca ta tablice. Nie wiem jednak, czy tak powinno sie robic? Moge tez w momencie wypelniania Grida zczytac ta tablice do jakiejs prywatnej zmiennej tablicy klasy Form1. Ale tez nie wiem czy to dobry sposob. Prosze o podpowiedz jak powinno sie taki temat rozwiazac.

0

Zrób sobie klasę statyczną z klasy A. Będziesz mógł w łatwy sposób korzystać z metod statycznych w innych formach. Nie wiem z czego dokładnie korzysta metoda ZwrocTabele(), ale zgaduje, że wykorzystuje właściwości z klasy A, które mogą mieć charakter statyczny. Polecam blog C.Walenciuka - http://www.cezarywalenciuk.pl/post/2011/06/06/Kurs-Obiektowosc-w-C-Klasa-statyczna-i-anonimowa-02.aspx

0

Czy jednak statyczna? Funkcja ZwrocTabele() generuje i przeksztalca rozne tablice na podstawie losowosci Random. Zwrocona tablica zawsze jest inna.

0

Równie dobrze możesz zrobić tak:

 
private void Form1_Load(object sender, EventArgs e)
        {
            
            FillGrid(this.ZwrocTabele();
        }
 
    private int[] SprawdzTabele()
    {
       klasaA ka = new klasaA();
       return kA.ZwrocTabele();
    }

Tylko po co to przechowywać logikę w formie ? Dojdzie druga forma i będziesz implementował tą samą metodę albo tworzył referencję do formy, w której jest już ta metoda i zmienisz modyfikator dostępu na public/internal ?
Możesz samą metodę statyczną tylko w klasie A zrobić zamiast całą klasę. Nie wiem co tam jest wrzucone, więc zależnie od potrzeb metoda statyczna może być wystarczająca. Myślę, że kierowanie się zasadą wszystko co może być statyczne powinno takie być jest dobrą zasadą.

0

No wlasnie nie moge tak zrobic. Funkcja ZwrocTabele() generuje tabele na podstawie danych losowych. Zawsze jest inna. Ponowne stworzenie obiektu i wywolanie metody zwrooci juz zupelnie inna tablice. A ja na koncu dzialania aplikacji chce porownac to co pozmienialem na Formie do wzorca wygenerowanego na poczatku dzialania aplikacji.

1

W klasie głównej stwórz sobie zmienną prywatną do której przypiszesz wygenerowaną tablicę.
wtedy w metodzie FillGrid użyjesz tej zmiennej, grida załadujesz a dane będziesz miał dostępne w zmiennej.

0

Zrób z klasy przechowującej dane (czyli te tablicę) Singletona. Będziesz miał jedną instancję w całym programie i bez problemu będziesz mógł się do niej odwoływać. Po drugie nie stosuj funkcji typu zwrocTabele() etc... Od takich rzeczy masz gettery oraz settery.

class Singleton {
        private static Singleton _instance;
        private Singleton() {
            _instance = null;
        }

        public static Singleton Instance{
            get {
                if (_instance == null) _instance = new Singleton();
                return _instance;
            }
        }
    }

Tutaj masz dowód na to, że to działa: https://ideone.com/dRoP3y
Gdyby to były dwa różne obiekty to program zwróciłby dwa razy jedynkę.

2

O ile dobrze zrozumiałem zamysł to według mnie to powinno wyglądać tak:

namespace projekt
{
   public class KlasaA
   {
      public int[] ZwrocTabele()
      {
         /* ... */
         return table;
      }
   }

   public class Form1 : Form
   {
      private KlasaA klasaA = new KlasaA();
      private readonly int[] _gridData;

      public Form1()
      {
         _gridData = klasaA.ZwrocTabele();
      }

      private void Form1_Load(object sender, EventArgs e)
      {
         FillGrid(_gridData);
      }

      private void FillGrid(int[] table)
      {
         /* ... */
      }

      private int[] GetGridData()
      {
         /* ... */
         return table;
      }

      private void SprawdzTabele()
      {
         /* 
            * GetGridData() Equals _gridData
            */

      }
   }
}
0

do DibbyDum - tak - no to jest ten pomysl z przepisaniem tablicy do lokalnej w klasie glownej. Dzieki

0
grzesiek51114 napisał(a):

Zrób z klasy przechowującej dane (czyli te tablicę) Singletona. Będziesz miał jedną instancję w całym programie i bez problemu będziesz mógł się do niej odwoływać. Po drugie nie stosuj funkcji typu zwrocTabele() etc... Od takich rzeczy masz gettery oraz settery.

class Singleton {
        private static Singleton _instance;
        private Singleton() {
            _instance = null;
        }

        public static Singleton Instance{
            get {
                if (_instance == null) _instance = new Singleton();
                return _instance;
            }
        }
    }

Tutaj masz dowód na to, że to działa: https://ideone.com/dRoP3y
Gdyby to były dwa różne obiekty to program zwróciłby dwa razy jedynkę.

Nie znam tego rozwiazania - bede musial sie zapoznac - Dzieki!

0

Nie rób singletona skoro możesz go uniknąć. Singletona w ten sposób powinno się używać tylko w razie konieczności, a rzadko taka występuje. I tutaj teraz też jej nie ma. Rozwiązanie od @DibbyDum ma najwięcej sensu w opisywanym przykładzie.

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