• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Problem z modyfikatorami dostepu

Object Storage Arubacloud
0 głosów
217 wizyt
pytanie zadane 21 maja 2019 w C# przez Lil Keyboard Użytkownik (560 p.)

Czesc,

Mam dwie klasy, z ktorych jedna dziedziczy po drugiej. Chcialbym aby wlasciwosc X oraz Y nie bylo dostepne z zewnatrz, tj. zeby nie mozna bylo stworzyc obiektu klasy Punkt i odwolac sie do X i Y ale chcialbym aby w klasie Odcinek, metoda ObliczDlugoscOdcinka miala dostep do X i Y. Czy jest to wgl mozliwa konstrukcja ? Przy zastosowaniu Protected niestety nie moge sie odwolac do X we wspomniaje wczesniej metodzie a przy zastosowniu Protected Internal moge sie odwolac do X z poziomu metody Main czego rowniez nie chce.

 

Czy stosowanie modyfikatora dostepu jakim jest Internal ma wgl sens gdy pracuje w jednej bibliotece ?

Tak na koniec chcialem tylko zapytac, wydaje mi sie ze glupie pytanie no ale jestem poczatkujacym programista i stad ta niewiedza, ktora chce uzupelnic. Biblioteka a Przesten Nazw to dwie rozne rzeczy nie ?

 

Pozdrawiam i licze na wyrozumialosc :v

class Punkt
    {
        protected int X { get; set; }
        protected internal  int Y { get; set; }
        public Punkt(int _x, int _y)
        {
            this.X = _x;
            this.Y = _y;
        }
        public void Przesun(int nowyX, int nowyY)
        {
            X += nowyX;
            Y += nowyY;
        }
        public void Wyswietl()
        {
            System.Console.WriteLine("Aktualne wspolrzedne wynosza: [{0}, {1}]", X, Y);
        }

        static public void SprawdzCzyLezaNaJednejProstej(Punkt[] _tab)
        {
            double ab, ac;
            ab = (_tab[1].Y - _tab[0].Y) / (_tab[1].X - _tab[0].X);
            ac = (_tab[2].Y - _tab[1].Y) / (_tab[2].X - _tab[1].X);

            if (ab == ac)
            {
                System.Console.WriteLine("Punkty sa wspoliniowe");
            }
            else
            {
                System.Console.WriteLine("Punkty nie sa wspoliniowe");
            }
        }
    }
    class Odcinek : Punkt
    {
        // public int Ox { get; set; }
        // public int Oy { get; set; }
        public Odcinek(int _x, int _y) : base(_x, _y)
        {
            // this.Ox = _x;
            // this.Oy = _y;
        }

        static public void ObliczDlugoscOdcinka(Punkt p1, Punkt p2)
        {
            double dlugoscOdcinka;
            dlugoscOdcinka = Math.Sqrt(((p2.X - p1.X) * (p2.X - p1.X) + (p2.Y - p1.Y) * (p2.Y - p1.Y)));
            System.Console.WriteLine("Dlugosc odcinka wynosi: {0}", dlugoscOdcinka);
        }
    }

 

komentarz 21 maja 2019 przez NowyUrzydgownig Mądrala (5,090 p.)
metoda nie może mieć większych uprawnień niż klasa w której się znajduje.
komentarz 21 maja 2019 przez Lil Keyboard Użytkownik (560 p.)
czyli musze zmienic modyfikator dostepu do klasy tak ?
1
komentarz 21 maja 2019 przez aeragram Obywatel (1,760 p.)

@Lil Keyboard, Cześć,

NowyUrzydgownig ma rację co do uprawnień klasy i jej składowych, czyli twoja klasa Punkt musi być public, a nie private jak jest domyślnie dla klas (w sytuacji kiedy nie podamy żadnego modyfikatora dostępu dla klasy jest to private).

Osobiście zastanawiam się nad hierarchią dziedziczenia w twoim projekcie. Moim zdaniem chyba nie jest to najlepsze rozwiązanie. Wydaje mi się, że klasa Odcinek nie powinna dziedziczyć po klasie Punkt. Dla mnie to trochę tak, jakby klasa Człowiek dziedziczyła po klasie Noga :) Też się dopiero uczę, ale myślę, że obiekt klasy Odcinek składa się z dwóch obiektów klasy Punkt. Mam wrażenie, że w tym przypadku właśnie agregacja jest bardziej na miejscu.

Pozdrawiam aeragram

komentarz 21 maja 2019 przez Lil Keyboard Użytkownik (560 p.)
Wiesz co tez nie jestem przekonany co do tego dziedziczenie ale nie mialem innego pomsylu :v. Tresc zadania byla taka:

Zdefiniuj klasę Odcinek składającą się z dwóch punktów klasy Punkt. W klasie Odcinek

zdefiniuj metodę, która obliczy długość odcinka.

Masz w takim razie jakis lepszy pomysl ?
1
komentarz 21 maja 2019 przez aeragram Obywatel (1,760 p.)
Jeszcze mnie naszło, że właściwości X i Y możnaby ograniczyć w ten sposób, że tylko wewnętrzne składowe klasy mogłyby zmieniać te wartości, natomiast na zewnątrz możnaby swobodnie je odczytywać, czyli zrobić

public int X { get; private set; }

Zmieniłbym też metody statyczne na niestatyczne. W przypadku Punktu możnaby odpalać metodę związaną z danym punktem

public bool CzyLezeNaProstej(Odcinek odcinek){...}

 Natomiast w przypadku ObliczDlugoscOdcinka metoda bez problemu może skorzystać z danych odcinka, jeżeli odcinek będzie przechowywał dane Punkt punktPoczatkowy i Punkt punktKoncowy

Może źle myśle, ale chyba ma to sens.

Pozdrawiam aeragram
komentarz 21 maja 2019 przez aeragram Obywatel (1,760 p.)
No i okazuje się, że w samym zadaniu jest napisane ""składającą się", a nie dziedziczącą :)
komentarz 21 maja 2019 przez Lil Keyboard Użytkownik (560 p.)
No tak ale w takim razie co dokladnie oznacza ze sklada sie i w sumie czemu pozbywac sie static ?

1 odpowiedź

+1 głos
odpowiedź 21 maja 2019 przez aeragram Obywatel (1,760 p.)

Myślę, że zrobiłbym to tak

public class Punkt
    {
        public int X { get; private set; }
        public int Y { get; private set; }
        
	    public Punkt(int x, int y)
        {
            X = x;
            Y = y;
        }
        
        public bool CzyLezaNaJednejProstej(Odcinek odcinek)
        { ..... }
    }

public class Odcinek
    {
	    public Punkt Poczatek { get; private set; }
	    public Punkt Koniec { get; private set; }        

        public Odcinek(Punkt poczatek, Punkt koniec)
        {
            Poczatek = poczatek;
            Koniec = koniec;
        }
 
        public double DlugoscOdcinka()
        {
            double dlugoscOdcinka;
            dlugoscOdcinka = Math.Sqrt(((Koniec.X - Poczatek.X) * (Koniec.X - Poczatek.X) + (Koniec.Y - Poczatek.Y) * (Koniec.Y - Poczatek.Y)));
            System.Console.WriteLine("Dlugosc odcinka wynosi: {0}", dlugoscOdcinka);
	        return dlugoscOdcinka;
        }
    }

Tak na szybko, więc mogłem gdzieś zrobić błąd, ale coś w tym sensie.

Pozdrawiam aeragram

 

komentarz 21 maja 2019 przez Lil Keyboard Użytkownik (560 p.)
ahaaa, no ale tak btw to czemu wszyscy chca zawsze unikac tego magicznego static ? Przeciez to fajne dosc ze nie trzeba tworzyc obiektu a moge skorzystac z jego funkcji
2
komentarz 21 maja 2019 przez aeragram Obywatel (1,760 p.)
Myślę, że nie chodzi o unikanie static, tylko o zachowanie sensu obiektów. Obiektowość oznacza, że myślimy o danych w programie jak o obiektach, więc jak już jest obiekt odcinek, który składa się z danych dwóch punktów, to obliczenie długości wykonamy właśnie dla tego konkretnego odcinka. Kiedy w tym przypadku używamy static to tak naprawdę "udajemy", że programujemy obiektowo :)

Pozdrawiam aeragram
1
komentarz 22 maja 2019 przez NowyUrzydgownig Mądrala (5,090 p.)

@Lil Keyboard,
Static ma sens, kiedy wiesz, że nie będziesz potrzebował dziedziczyć tego co zostało oznaczone jako static i nie będziesz potrzebował konstruktora, który zainicjalizuje pewne klasy, które będą potrzebne do wykonania danej metody. W twoim przypadku miałoby sens stworzenie np. statycznej metody w klasie Punkt, która dodaje dwa punkty. Albo w klasie Odcinek, która tworzy nowy odcinek z dwóch punktów (zamiast wykorzystywać do tego konstruktor - wtedy ma to nazwę wzorca Factory). Ale już metoda w twojej klasie czyLeży NaProstej potrzebuje punktu i odcinka, więc nie ma zbytnio sensu robić jej statycznej. Również metoda dlugośćOdcinka nie powinna być statyczna - i nie powinna w ogóle być metodą, bo wydaje się, że dość często będzie potrzebna oraz jest właściwością obiektu, więc powinieneś mieć gettera, a metoda może być co najwyżej prywatna jako metoda pomocnicza.

komentarz 22 maja 2019 przez Lil Keyboard Użytkownik (560 p.)

@NowyUrzydgownig,

Dodalem w tkaim razie cos takiego, to miaels na mysli ?

public class Odcinek
    {
        public Punkt Poczatek { get; private set; }
        public Punkt Koniec { get; private set; }
        private double _InternalDlugoscOdcinka;
        public double DlugoscOdcinka
        {
            get
            {
                return _InternalDlugoscOdcinka;
            }

            private set
            {
                _InternalDlugoscOdcinka = Math.Sqrt(((Koniec.X - Poczatek.X) * (Koniec.X - Poczatek.X) + (Koniec.Y - Poczatek.Y) * (Koniec.Y - Poczatek.Y)));
            }
        }
        public Odcinek(Punkt _Poczatek, Punkt _Koniec)
        {
            Poczatek = _Poczatek;
            Koniec = _Koniec;
        }

Czemu w sumie chcesz to wsadzic w setter ? Napisales ze pewnie bede z tego czesto korzystal(w sensnie z dlugosci odcninka) dlatego lepiej to tak zrobic niz ttrzymac w metodzie. Dlaczego teraz jest lepiej ?

komentarz 22 maja 2019 przez Lil Keyboard Użytkownik (560 p.)

@NowyUrzydgownig,

Mam tez jeszcze jedno zadanie gdzie po prostu musze stworzyc klase Prostopadloscian, ktora zawiera dlugosc, szerokosc i wysokosc i oblicza objetosc. Myslisz ze objetosc tez potraktowac jako zmienna i zrobic tak jak powyzej z dlugoscia prostej ?

1
komentarz 23 maja 2019 przez NowyUrzydgownig Mądrala (5,090 p.)
Tak. Jednak co do implementacji Dlugości, to jest źle. Powinieneś mieć zwyczajny private set i ustawiać go wtedy, gdy ustawiasz Początek albo Koniec. A jeśli Początek i Koniec nie mogą się zmienić, to wówczas jedynie w konstruktorze ustawiasz wartość Długość. Również jawna implementacja gettera i settera akurat w tym przypadku nie jest wymagana. Wystarczy ci - public double Dlugosc { get; private set; }. Jest to pewna właściwość twojej klasy, więc nie powinno się tworzyć publicznej metody, aby ją obliczyć. Twoje metody w klasie to pewne akcje, czynności, które możesz wykonać mając odcinek. Np. obrócić względem jakiejś osi.

Podobne pytania

0 głosów
1 odpowiedź 138 wizyt
0 głosów
2 odpowiedzi 659 wizyt
pytanie zadane 18 sierpnia 2020 w Sieci komputerowe, internet przez Tine Użytkownik (690 p.)
0 głosów
1 odpowiedź 7,076 wizyt

92,573 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...