Dostęp do metody prywatnej

Dostęp do metody prywatnej
BA
  • Rejestracja: dni
  • Ostatnio: dni
0

Cześć,

Zaczynam przygodę z programowaniem.
Znalazłem takie oto zadanie do zrobienie w C sharp:
Napisz program, który tworzy klasę Prostokat, zawierającą dwie prywatne dane
składowe: dlugosc, szerokosc, dwie prywatne metody: powierzchnia(), obwod() oraz metodę
publiczną – Prezentuj() (która wyświetla powierzchnię i obwód prostokąta) i konstruktor
inicjalizujący. W metodzie Main() zdefiniuj obiekt i uruchom dla niego metodę Prezentuj().

Zrobiłem tak (działa):

Kopiuj
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication28
{
    class Program
    {
        public class Prostokat
        {
            private double szerokosc;
            private double dlugosc;
            private double powierzchnia;
            private double obwod;

            public double Powierzchnia // właściwość 
            {
                get { return powierzchnia; }
                set { powierzchnia = value; }
            }


            public double Obwod // właściwość 
            {
                get { return obwod; }
                set { obwod = value; }
            }



            public double Szerokosc // właściwość 
            {
                get { return szerokosc; }
                set { szerokosc = value; }
            }


            public double Dlugosc // właściwość 
            {
                get { return dlugosc; }
                set { dlugosc = value; }
            }


            public Prostokat(double szerokosc1, double dlugosc1) // konstruktor
            {
                szerokosc = szerokosc1;
                dlugosc = dlugosc1;
                powierzchnia = this.powierzchniamet(szerokosc, dlugosc);
                obwod = this.obwodmet(szerokosc, dlugosc);
            }

            
            private double powierzchniamet(double szer1, double dlug1)  // metoda
            {
                return szer1 * dlug1;
            }
            

            private double obwodmet(double szer2, double dlug2) // metoda
            {
                return 2 * (szer2 + dlug2);
            }

           
            public void prezentuj(double pow1, double obw1)  // metoda
            {
                Console.WriteLine("szerokosc: {0}, dlugosc: {1}", this.Szerokosc, this.Dlugosc);
                Console.WriteLine("powierzchnia: {0}, obwod: {1}", pow1, obw1);
            }
        }
        

        static void Main(string[] args)
        {
            Prostokat pr1 = new Prostokat(2, 1);           
            pr1.prezentuj(pr1.Powierzchnia, pr1.Obwod);            
            Console.ReadKey();
        }
    }

}

I tu moje pytanie czy da się to zrobić mądrzej? tzn. na pewno się da, tylko jak?

grzesiek51114
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2442
3
  • private set zamiast set albo zastosuj całkowicie własności publiczne, bez pól prywatnych, choć w tym przypadki to trochę bez sensu;
  • var pr1 zamiast Prostokat pr1;
  • Nazwy wszystkich metod piszemy w .Net'cie z wielkiej litery, nie tylko publicznych;
  • Console.ReadKey() niepotrzebne CTRL+F5 załatwia sprawę;
  • Zamiast szerokosc = szerokosc1; lepiej zrobić this.szerokosc = szerokosc;, a w metodzie: Prostokat(double szerokosc, double dlugosc). Jedynki, które zastosowałeś są bez sensu. We wszystkich metodach, których do dotyczy;
  • No i lepiej od razu zacząć pisać po angielsku :)
  • Aha, no i nie stosuj komentarzy w stylu // właściwość , bo to od razu widać :)
BA
  • Rejestracja: dni
  • Ostatnio: dni
0

Dzięki za rady. Chodziło mi bardziej o to czy można się w metodzie Main w jakiś sposób dostać do wyniku metod prywatnych powierzchniamet i obwodmet.

grzesiek51114
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2442
1

Nie. Po to metody są prywatne żeby nie można było ich wykonywać "z zewnątrz": ponieważ służą wewnętrznej logice klasy. Jak chcesz wiedzieć jaki jest wynik to postaw sobie pułapkę w debugu.

CF
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 55
1

Da się, poprzez refleksję, ale jej użycie w tym przypadku jest bez sensu i na tym etapie nauki nie warto w ogóle się zajmować tym mechanizmem. W prostu sposób nie da się tego zrobić, w końcu po to zostało to oznaczone jako prywatne, żeby się nie dało.

BA
  • Rejestracja: dni
  • Ostatnio: dni
0

No tak. Dzięki.

  • Rejestracja: dni
  • Ostatnio: dni
2

Metoda publiczna Prezentuj powinna w tym przypadku prezentować siebie a więc swój obwod i powierzchnię a nie parametry podawane zewnętrznie.

abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
2

to jest bez sensu public void prezentuj(double pow1, double obw1) - po to masz długość i szerokość oraz metody powierzchniamet i obwodmet (BTW wywal to met z nazw), żeby tego nie podawać tylko pobrać

BA
  • Rejestracja: dni
  • Ostatnio: dni
0

Poprawione:

Kopiuj
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication28
{
    class Program
    {
        public class Prostokat
        {
            private double szerokosc;
            private double dlugosc;
            private double powierzchnia;
            private double obwod;

            public double Powierzchnia 
            {
                get { return powierzchnia; }
                set { powierzchnia = value; }
            }


            public double Obwod 
            {
                get { return obwod; }
                set { obwod = value; }
            }



            public double Szerokosc 
            {
                get { return szerokosc; }
                set { szerokosc = value; }
            }


            public double Dlugosc 
            {
                get { return dlugosc; }
                set { dlugosc = value; }
            }


            public Prostokat(double szerokosc, double dlugosc) 
            {
                this.szerokosc = szerokosc;
                this.dlugosc = dlugosc;
                powierzchnia = PowierzchniaOblicz(szerokosc, dlugosc);
                obwod = ObwodOblicz(szerokosc, dlugosc);
            }


            private double PowierzchniaOblicz(double szer1, double dlug1)  
            {
                return szer1 * dlug1;
            }


            private double ObwodOblicz(double szer2, double dlug2) 
            {
                return 2 * (szer2 + dlug2);
            }


            public void Prezentuj() 
            {
                Console.WriteLine("szerokosc: {0}, dlugosc: {1}", Szerokosc, Dlugosc);
                Console.WriteLine("powierzchnia: {0}, obwod: {1}", Powierzchnia, Obwod);
            }
        }


        static void Main(string[] args)
        {
            Prostokat pr1 = new Prostokat(2, 1);
            pr1.Prezentuj();
            Console.ReadKey();
        }
    }
}

Jakby się mógł się ktoś pochylić nad tym i sprawdzić czy taki kod nie budzi wątpliwości to byłbym wdzięczny.

grzesiek51114
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2442
0

@baronio: trochę nie chce mi się powtarzać ale przeleć jeszcze raz punkty, które Ci napisałem, razem z resztą osób, równolegle z kodem, który właśnie wkleiłeś. Zobaczysz, że mało poprawiłeś.

BA
  • Rejestracja: dni
  • Ostatnio: dni
0

Tak, mało ;) chciałem tylko wiedzieć czy metody są teraz logicznie skonstruowane i wywołane w dobrych miejscach. Dzięki za pomoc ;)

fasadin
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 4883
2

nie sa,

w konstruktorze nie powinno sie uzywac logiki obiektu tylko powinno sie go robic do konstruowania

Co jezeli stworze obiekt a pozniej mu zmienie wielkosc? Wtedy metoda Wyswietl bedzie po prostu zla

albo co jezeli stworze go i dzieki Twojemu kodu zmienie mu powierzchnie? Kod jest napisany zle. Pozwala zmiany z zewnatrz ktore niszcza logike obiektu. Malo tego, obiekt nie ma dostepnej logiki (bo ona sie dzieje w konstruktorze)

BA
  • Rejestracja: dni
  • Ostatnio: dni
0

No właśnie. Coś mi tu nie pasowało. Na spokojnie muszę przemyśleć temat bo przy innej robocie myśli nie mogę zebrać ;)

somekind
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
2
fasadin napisał(a):

w konstruktorze nie powinno sie uzywac logiki obiektu tylko powinno sie go robic do konstruowania

Proste wyznaczenie jakichś wartości to akurat nie jest aż taka logika, której nie można byłoby umieścić w konstruktorze. W tym przypadku to nie ma sensu, ale głównie dlatego, że jest niezgodne z treścią zadania.

Co jezeli stworze obiekt a pozniej mu zmienie wielkosc? Wtedy metoda Wyswietl bedzie po prostu zla

Ten problem nie wynika z umieszczenia logiki w konstruktorze lecz z umożliwienia manipulowania stanem obiektu przez publiczne właściwości.

baronio napisał(a):

No właśnie. Coś mi tu nie pasowało. Na spokojnie muszę przemyśleć temat bo przy innej robocie myśli nie mogę zebrać ;)

Przede wszystkim, co robią tutaj te wszystkie właściwości, skoro w treści zadania nie ma o nich mowy?

BA
  • Rejestracja: dni
  • Ostatnio: dni
0

Bez zbędnych zmiennych i metod tak mi to wyszło. Myślę, że kod akceptowalny jak na początek przygody z programowaniem obiektowym. Zastanawiam się tylko czy zalecane jest używanie w deklaracji metod i jej wnętrzu takich samych nazw zmiennych jak te przekazane do metody (szerokosc, dlugosc).

Kopiuj
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication28
{
    class Program
    {
        public class Prostokat
        {
            private double szerokosc;
            private double dlugosc;
           
            
            public double Szerokosc
            {
                get { return szerokosc; }
                set { szerokosc = value; }
            }


            public double Dlugosc
            {
                get { return dlugosc; }
                set { dlugosc = value; }
            }


            public Prostokat(double szerokosc, double dlugosc)
            {
                this.szerokosc = szerokosc;
                this.dlugosc = dlugosc;
            }


            private double PowierzchniaOblicz(double szerokosc, double dlugosc)
            {
                return szerokosc * dlugosc;
            }


            private double ObwodOblicz(double szerokosc, double dlugosc)
            {
                return (2*(szerokosc * dlugosc));
            }


            public void Prezentuj()
            {
                Console.WriteLine("szerokosc: {0}, dlugosc: {1}", szerokosc, dlugosc);
                Console.WriteLine("powierzchnia: {0}, obwod: {1}", PowierzchniaOblicz(szerokosc, dlugosc), ObwodOblicz(szerokosc, dlugosc));
            }
        }


        static void Main(string[] args)
        {
            Prostokat pr1 = new Prostokat(2, 2);
            pr1.Prezentuj();
            Console.ReadKey();
        }
    }

}
grzesiek51114
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2442
1

Chyba nie bardzo rozumiesz o co tak dokładnie chodzi:

Kopiuj
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Soft
{
    class Prostokat
    {
        private double dlugosc;
        private double szerokosc;

        public Prostokat(double dlugosc, double szerokosc)
        {
            this.dlugosc = dlugosc;
            this.szerokosc = szerokosc;
        }

        public void Prezentuj()
        {
            Console.WriteLine("Szer: {0}, Dł: {1}, Ob: {2}, Pow: {3}",
                this.szerokosc, this.dlugosc, this.LiczObwod(), this.LiczPowierzchnie());
        }

        private double LiczObwod()
        {
            return 2.0 * (this.szerokosc + this.dlugosc);
        }

        private double LiczPowierzchnie()
        {
            return this.szerokosc * this.dlugosc;
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var pr = new Prostokat(2.5, 5.6);
            pr.Prezentuj();
        }
    }
}

@fasadin w prezentacji danych musisz wykorzystać prywatne metody, bo w klasie nie masz pól do przechowania powierzchni i obwodu. Czytaj dokładnie treść zadania, a nie od razu wdrażaj MVC :D

BA
  • Rejestracja: dni
  • Ostatnio: dni
0

Dzięki za wysiłek chłopaki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.