Dostęp do metody prywatnej

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):

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?

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ć :)
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.

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.

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.

0

No tak. Dzięki.

2

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

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ć

0

Poprawione:

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.

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ś.

0

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

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)

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ć ;)

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?

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).

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();
        }
    }

}
1

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

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

0

Dzięki za wysiłek chłopaki.

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