Witajcie,
postanowiłem zacząć uczyć się języka C# ale mam problem z jednym zagadnieniem. Otóż mam klasę z kilkoma zmiennymi i drugą klasę w której zmienne z pierwszej chce wykorzystać. Chce, aby wartości tych zmiennych były tam zmieniane, tak aby klasa 1 operowała potem na nowych wartościach. Jak to zrobić?
Tworzę obiekt 1 klasy w klasie 2 ale wtedy kompilator zgłasza błędy bo jakaś zmiennaX nie istnieje w kontekście 2 klasy.
Prosiłbym aby ktoś wyjaśnił mi to prostym językiem.
Pozdrawiam i z góry dziękuję
Kiedy tworzysz zmienną zmienną w klasie 1, to musisz napisać coś takiego:
public int zmienna = 0;
zamiast
int zmienna = 0;
Wtedy możesz w klasie 2 zrobić coś takiego:
klasa1.zmienna = 3;
Kiedy nie używasz słowa public, to zmienna jest domyślnie traktowana przez kompilator jako prywatna i nie można się do niej odwołać z klasy 2.
Możesz wrzucić fragment kodu?
A jak wygląda sposób na uzyskane tego samego efektu, ale bez modyfikatora public? Musimy się przecież starać aby nasz kod był maksymalnie niepubliczny
W klasie1 tworzysz publiczne metody operujące na tych zmiennych (chyba o pola Ci chodzi w tym momencie?). Obiekt klasy1 przekazujesz w konstruktorze do klasy2 i zapisujesz go w polu klasy2. W metodach klasy2 możesz teraz wywoływać metody klasy1, dzięki czemu możesz zmieniać interesujące Cię wartości, a klasa1 będzie dalej operować na zmienionych.
Tak, z tego co wyczytałem rzeczywiście chodzi mi o pola;-)
somekind napisał(a):
Obiekt klasy1 przekazujesz w konstruktorze do klasy2 i zapisujesz go w polu klasy2.
Czy mógłbyś mi to jaśniej przekazać? Może pokazać kawałek jakiegoś kodu. Byłbym bardzo wdzięczny.
Klasa2
{
Klasa1 klasa1;
public Klasa2(Klasa1 klasa1)
{
this.klasa1 = klasa1;
}
}
I teraz w kodzie Klasa1:
var k2 = new Klasa2(this);
class Program
{
public int zmienna = 5;
public int liczba = 6;
static void Main(string[] args)
{
Program klasa1 = new Program();
klasa1.Wyswietl();
}
void Wyswietl()
{
var k2 = new Obliczenia(this);
k2.WykonajObliczenia();
if (zmienna == 6) Console.WriteLine("zmienna == 6");
if (liczba == 7) Console.WriteLine("liczba == 7");
var InObl = new InneObliczenia(this);
InObl.NoweObliczenia2();
Console.WriteLine(liczba);
Console.ReadKey();
}
}
class Obliczenia
{
public int tempLiczba = 1;
Program programik;
public Obliczenia(Program programik)
{
this.programik = programik;
}
public void WykonajObliczenia()
{
programik.zmienna = 5 + 1;
var InO = new InneObliczenia(this);
InO.NoweObliczenia();
programik.liczba = tempLiczba;
}
}
class InneObliczenia
{
Obliczenia obliczenia;
public InneObliczenia(Obliczenia obliczenia)
{
this.obliczenia = obliczenia;
}
Program programik;
public InneObliczenia (Program programik)
{
this.programik = programik;
}
public void NoweObliczenia()
{
obliczenia.tempLiczba = obliczenia.tempLiczba + 6 ;
}
public void NoweObliczenia2()
{
programik.liczba += 10;
}
}
Na podstawie wskazówek zbudowałem coś takiego. Wynik mnie satysfakcjonuje otrzymałem to co chciałem czyli w kolejnych liniach
zmienna == 6
zmienna == 7
17
Czy to co napisałem jest poprawne? Chodzi mi głównie o ostatnią klasę. Metody w niej zawarte wywołuje zarówno z klasy Obliczenia jak i Program. Dlatego umieściłem tam 2 kostruktory. Czy zrobiłem to poprawnie?
Pomogłoby gdybyś podał treść zadania, bo jak dla mnie cały program nie ma sensu.
nie ma treści zadania. Tworze program aby się zrozumieć to.
Założyłem, że w klasie Program będę miał jakieś pola. Następnie wywołam metody z innych klas które będą operować na polach klasy Program. w taki sposób, że będą zmieniać ich wartość.