Dostęp do metody prywatnej

Odpowiedz Nowy wątek
2017-03-20 12:02
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?


Bądź miły dla ludzi kiedy pniesz się w górę,
bo możesz ich spotkać kiedy będziesz spadał w dół
edytowany 1x, ostatnio: DibbyDum, 2017-03-20 16:05

Pozostało 580 znaków

2017-03-20 14:45
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)

edytowany 3x, ostatnio: fasadin, 2017-03-20 14:51

Pozostało 580 znaków

2017-03-20 14:50
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ć ;)


Bądź miły dla ludzi kiedy pniesz się w górę,
bo możesz ich spotkać kiedy będziesz spadał w dół
edytowany 2x, ostatnio: DibbyDum, 2017-03-20 16:04
Pokaż pozostałe 4 komentarze
1) mozesz edytowac 2) nadal nie widze powodu by mnie przepraszac - fasadin 2017-03-20 15:53
@baronio: wrzuć na luz. Jak dostałem od niego po tyłku w Quake'a to myślisz, że mnie przeprosił? :) - grzesiek51114 2017-03-20 15:56
Kurtuazja - sprawdź w słowniku, a zrozumiesz co miałem na myśli pisząc do Ciebie "wybacz". - baronio 2017-03-21 08:10
no to zle ja uzywasz, zamiast przepraszac powinienes podziekowac. - fasadin 2017-03-21 09:41
Przezawabny jesteś ;) Koledzy musza mieć z Tobą wesoło. - baronio 2017-03-21 10:33

Pozostało 580 znaków

2017-03-21 03:39
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?

napisalem odnosnie jego kodu ;) Wiadomo, ze ustawienie jakis tam zmiennych to straszna logika to nie jest i mozna by zachowac w konstruktorze :) - fasadin 2017-03-21 09:43

Pozostało 580 znaków

2017-03-21 08:38
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();
        }
    }
 
}

Bądź miły dla ludzi kiedy pniesz się w górę,
bo możesz ich spotkać kiedy będziesz spadał w dół
Myślę, że kod akceptowalny jak na początek przygody z programowaniem obiektowym nie. Mieszasz warstwe reprezentujaca (wyswietlajaca) z logika. Cos co wyswietla nigdy nie powinno nic obliczac. - fasadin 2017-03-21 09:43
@fasadin: ale to nie jego wina, taka jest treść zadania. - somekind 2017-03-21 11:55

Pozostało 580 znaków

2017-03-21 09:55

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

edytowany 5x, ostatnio: grzesiek51114, 2017-03-21 10:09

Pozostało 580 znaków

2017-03-21 10:34
0

Dzięki za wysiłek chłopaki.


Bądź miły dla ludzi kiedy pniesz się w górę,
bo możesz ich spotkać kiedy będziesz spadał w dół

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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