Pomoc w zrozumieniu konstruktorów(this)

0

Witam! Po moich wcześniejszych wypocinach(kółko i krzyżyk, symulator LOTTO), które były pisane w jednej klasie i milionach metod, postanowiłem się wziąć za dokładne zrozumienie klas, obiektów, operatorów i po co to wszystko się robi. Korzystam z kursu ze strony CentrumXP.pl - http://www.centrumxp.pl/dotNet/323,07-Tworzenie-oraz-inicjalizacja-obiektow.aspx (może byście przy okazji powiedzieli, czy warto z niego korzystać) i przy rozdziale o konstruktorach napotkałem problem przy zagadnieniu: Wywołanie jednego konstruktora poprzez drugi. Według mnie autor tekstu nie wywołał pierwszego konstruktora w drugim, bo przy słówku "this" jako parametr podał "parametr1", a w pierwszym konstruktorze parametrem jest "parametr", czyli dwie różne zmienne. Czy autor tekstu popełnił błąd, czy ja źle to rozumiem? Jeśli to drugie, to moglibyście to jakoś wytłumaczyć na polski jak to powinienem zrozumieć? Z góry dzięki!

Wywołanie jednego konstruktora poprzez drugi

Aby uzyskać taki efekt musimy użyć słówka „this”.

class Echo
{
    string napis;
    string napis2;

    public Echo(string parametr)
    {
        napis = parametr;
    }

    public Echo(string parametr1, string parametr2) : this(parametr1)
    {
        napis2 = parametr2;
    }

    public void Napisz()
    {
        System.Console.WriteLine(napis);
        System.Console.WriteLine(napis2);
    }
}
class KlasaGlowna
{
    static void Main()
    {
        Echo obiekt = new Echo("Pierwszy parametr.", "Drugi parametr.");
        obiekt.Napisz();
        System.Console.ReadLine();
    }
}

W tym przykładzie mamy dwa konstruktory, z jednym oraz z dwoma parametrami. W definicji drugiego wywołujemy pierwszy poprzez słówko „this” oraz przekazujemy do pierwszego pierwszy parametr. W linijce:

Echo obiekt = new Echo("Pierwszy parametr.", "Drugi parametr.");

wywołujemy drugi konstruktor (dwa parametry), ten natomiast wywołuje pierwszy przekazując mu wartość „Pierwszy parametr.". Tak więc wartość zmiennej „napis” jest ustalana w pierwszym konstruktorze, który został wywołany przez drugi, natomiast wartość zmiennej „napis2” jest przypisywana w drugim konstruktorze.

0

To

public Echo(string parametr1, string parametr2) : this(parametr1) 

powoduje wywołanie jednoparametrowego konstruktora z parametrem parametr1.

0

Będzie ci to prościej zrozumieć jak zaczniesz rozgraniczać parametry i argumenty oraz dlaczego nazwa parametru w pierwszym konstruktorze nie ma znaczenia ani żadnego powiązania z nazwą argumentu.

0

No tak, ale czy ten wywołany konstruktor jest konstruktorem pierwszym, czy nowym? Bo w tekście jest napisane: "W definicji drugiego wywołujemy pierwszy poprzez słówko „this” oraz przekazujemy do pierwszego pierwszy parametr"

Edit: Czyli "parametr1" z drugiego konstruktora nie ma nic wspólnego z "parametr" z pierwszego?

0

Leniu! :) Zrób sobie w tym Twoim kodzie tak:

class Echo
{
    string napis;
    string napis2;

    public Echo(string parametr)
    {
        napis = parametr;
        Console.WriteLine("Konstruktor jednoparametrowy {0}:", parametr);
    }

    public Echo(string parametr1, string parametr2)
        : this(parametr1)
    {
        napis2 = parametr2;
        Console.WriteLine("Konstruktor dwuparametrowy: {0} , {1}", parametr1, parametr2);
    }

    public void Napisz()
    {
        System.Console.WriteLine(napis);
        System.Console.WriteLine(napis2);
    }
}
class KlasaGlowna
{
    static void Main()
    {
        Echo obiekt = new Echo("jeden parametr");
        Console.WriteLine("---");
        obiekt = new Echo("Parametr 1", "Parametr 2");
        Console.ReadKey();
    }
}
 

i sam zobacz, jak to się odbywa... :)

0

Oo, w sumie troszkę mi to rozjaśniło sprawę. Czyli chodzi o to, że ": this(parametr1) sprawia, że przed wykonaniem instrukcji z drugiego konstruktora wykonują się instrukcje z pierwszego, bo przy this jest podany jeden parametr?

1
bnbnowacki napisał(a):

Czyli chodzi o to, że ": this(parametr1) sprawia, że przed wykonaniem instrukcji z drugiego konstruktora wykonują się instrukcje z pierwszego, bo przy this jest podany jeden parametr?

Tak. Spróbuj zrobić coś takiego:

class Echo
{

    public Echo(int pint, int pint1, string pstring)
    {
        Console.WriteLine("Konstruktor trzyparametrowy: {0}, {1}, {2}", pint, pint1, pstring);
    }

    public Echo(string parametr) : this (12,15, parametr)
    {
        Console.WriteLine("Konstruktor jednoparametrowy {0}:", parametr);
    }

    public Echo(string parametr1, string parametr2)
        : this(parametr1)
    {
        Console.WriteLine("Konstruktor dwuparametrowy: {0} , {1}", parametr1, parametr2);
    }
}
class KlasaGlowna
{
    static void Main()
    {
        Echo obiekt = new Echo("jeden parametr");
        Console.WriteLine("---");
        obiekt = new Echo("Parametr 1", "Parametr 2");
        Console.ReadKey();
    }
} 

Zacznie Ci się dalej rozjaśniać.

Ale ale... czemu sam nie próbujesz? :)

0

W sumie nie wiem. Nie byłem na tyle kreatywny, żeby sobie stworzyć takie polecenie. Mam nadzieję, że to przyjdzie z czasem :) Dzięki wielkie! Już rozumiem!

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