Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki

KURS HOME ASSISTANT

Chcesz zautomatyzować swój dom bez skomplikowanego kodowania?
Zastanawiasz się nad wyborem sprzętu, oprogramowania i aplikacji?
Od czego zacząć przygodę z HA w 2025? Co będzie najlepsze na start?

Nasz kurs Home Assistant nauczy Cię krok po kroku, jak łatwo zautomatyzować swój dom i oszczędzić na rachunkach za prąd i ogrzewanie. Bez chmur, bez zbędnych abonamentów. Twoja przygoda z Home Assistant zaczyna się tutaj!

↓↓↓

    Szanujemy Twoją prywatność. Możesz wypisać się w dowolnym momencie.




    Teraz jest 20 maja 2025, o 02:07


    Strefa czasowa: UTC + 1





    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 
    Autor Wiadomość
    PostNapisane: 5 sty 2015, o 20:09 
    Offline
    Nowy

    Dołączył(a): 05 sty 2015
    Posty: 5
    Pomógł: 0

    Witajcie, postanowiłem poduczyć się programować w C#.
    Mam pewną klasę, w niej pola. W kodzie mam również inne klasy które chciałyby korzystać z tych pól.
    Jak je przekazać? chciałbym aby inne klasy widziały pola z klasy pierwszej a dodatkowo mogły je edytować.

    Pozdrawiam:)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 5 sty 2015, o 20:41 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 01 lis 2011
    Posty: 266
    Lokalizacja: Szczecin
    Pomógł: 9

    Tak ogólnie odpowiadając to pole musi być typu "public"

    Np:
    public string OpisModulu {get;set;}

    _________________
    www.gryfsmart.pl



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 5 sty 2015, o 20:49 
    Offline
    Nowy

    Dołączył(a): 05 sty 2015
    Posty: 5
    Pomógł: 0

    chciałbym uniknąć upubliczniania zmiennych, jest jakiś inny sposób?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 5 sty 2015, o 20:50 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 28 maja 2012
    Posty: 471
    Lokalizacja: ZGY/ZS
    Pomógł: 30

    Dodatkowo jeśli chcesz aby różne klasy pracowały na tej samej instancji to musi być static

    _________________
    eDiyCraft.blogspot.com



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 5 sty 2015, o 21:09 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 10 mar 2013
    Posty: 739
    Lokalizacja: Poznań
    Pomógł: 84

    Możesz dodać do klasy metody publiczne które zwrócą/zmodyfikują
    niepubliczne składowe klasy.
    Tylko ja dopiero raczkuje w C++ i nie wiem czy to jest dobry pomysł :)



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 5 sty 2015, o 21:57 
    Offline
    Nowy

    Dołączył(a): 05 sty 2015
    Posty: 5
    Pomógł: 0

    Ja tez dopiero raczkuje i wymyśliłem sobie, że chce się tego nauczyć. Wszędzie w internecie jest napisane jak przekazywać parametry metody (przez wartość lub referencję) ale wydaje mi się to problemowe gdy tych parametrów jest dużo lub gdy w jakieś klasie jest kilka/kilkanaście metod to nie ma sensu każdej przekazywać parametrów tylko przekazać parametry całej klasie. Tak mi się wydaje. Ale nie wiem jak to zrobić :?



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 5 sty 2015, o 22:01 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 28 maja 2012
    Posty: 471
    Lokalizacja: ZGY/ZS
    Pomógł: 30

    Poczytaj o dziedziczeniu

    _________________
    eDiyCraft.blogspot.com



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 5 sty 2015, o 22:31 
    Offline
    Nowy

    Dołączył(a): 05 sty 2015
    Posty: 5
    Pomógł: 0

    tak, ale przy dziedziczeniu w mojej klasie "pochodnej" dostane takie same pola, ale fizycznie będą to inne elementy. Ja natomiast chciałbym aby obydwie klasy operowały na tym samym



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 5 sty 2015, o 22:35 
    Offline
    Użytkownik

    Dołączył(a): 16 maja 2012
    Posty: 349
    Lokalizacja: Legnica
    Zbananowany użytkownik

    Pomógł: 23

    Żeby pola były widoczne na zewnątrz klasy muszą istnieć akcesory get,set (właściwości) albo pola muszą być public. Innej opcji chyba nie ma. Też dopiero macam się z C# więc "chyba". Na tym polega hermetyzacja lub jej brak. Static na polu zdaje się oznacza, że różne instatncje klasy posiadają jedną wspólną wartość pola typu static i chyba niekoniecznie musi to być pole public czyli widoczne na zewnątrz klasy. W takim przypadku instancje klasy potomnej widzą to samo co instancja klasy rodzica.

    _________________
    sig off ;(



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 sty 2015, o 00:30 
    Offline
    Nowy

    Dołączył(a): 25 lis 2014
    Posty: 18
    Pomógł: 4

    Kolego moriss, postawiłeś bardzo ważne pytanie.

    Na początku musisz znać różnicę pomiędzy klasą a obiektem. Upraszczając klasa jest to wzorzec (model), który jest wykorzystywany przy tworzeniu obiektu. Zgodnie z jednym z paradygmatów programowania obiektowego, powinno stosować się hermetyzację między obiektami, czyli "po chłopsku mówiąc" nie dopuszczać, by obiekt A zmieniał bezpośrednio wartości zmiennych obiektu B ( powinno się to robić z wykorzystaniem metod ). To w jaki sposób mogą być zmieniane wartości w poszczególnych obiektach definiują Modyfikatory dostępu. Określają one zakres widoczności dla zmiennych, metod, klas i są bezpośrednio związane z przestrzenią nazw. W C# przestrzeń nazw definiowana jest poprzez słowo kluczowe "namespace". Informację o modyfikatorach dostępu w C# znajdziesz w sieci bardzo łatwo, np. tutaj. Wiedzę o modyfikatorach dostępu powinieneś przyswoić sobie bardzo dobrze.

    Jakie modyfikatory powinny być użyte, to w dużym stopniu zależy czemu to ma służyć - są to tzw. założenia projektowe. Na tym etapie Ty jako projektant sobie to zakładasz. Wiesz najlepiej co chcesz osiągnąć ;)

    Uczułam nad zbyt nadmiernym stosowaniem modyfikatora "public". Należy ograniczyć go do minimum. Przez wielu początkujących jest on nadużywany z uwagi na pozornie łatwy dostęp do pól, natomiast niesie ze sobą wiele niebezpieczeństw i błędów, które jest później ciężko wykryć.

    "Ale nie taki diabeł straszny, jak go malują ... "

    Co do pytania:
    moriss napisał(a):
    chciałbym aby inne klasy widziały pola z klasy pierwszej a dodatkowo mogły je edytować.

    to jest trochę za mało precyzyjne. Musiałbyś napisać co tą są za klasy i co obiekty utworzone na podstawie tych klas miałyby robić. Będzie wtedy można łatwiej Ci doradzić jakich mechanizmów powinieneś użyć. Samą inicjalizację jednego obiektu z wykorzystaniem innego możesz wykonać w konstruktorze. Dodatkowo tak jak wspominał kolega savian86 możliwe, że będzie potrzeba wiedza w zakresie dziedziczenia.



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 sty 2015, o 00:45 
    Offline
    Nowy

    Dołączył(a): 05 sty 2015
    Posty: 5
    Pomógł: 0

    Dziękuję kolego za wyczerpującą odpowiedź.
    Sposób z ustawieniem pola jako publiczne znam. Umiem też przekazać zmienne wykorzystując metody. I o to właśnie chciałbym zapytać kolegę. Co jeśli tych zmiennych mam sporą liczbę? np dwucyfrową? jak wtedy radzić sobie z problemem?

    Pozdrawiam



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 sty 2015, o 09:27 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 28 maja 2012
    Posty: 471
    Lokalizacja: ZGY/ZS
    Pomógł: 30

    Jezeli przekazujesz taka ilość danych,to może należało by zmienić typ danych. Wykorzystać kolekcję/bazę danych /specjalnie stworzona klasę /wczytywać z pliku

    _________________
    eDiyCraft.blogspot.com



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 sty 2015, o 10:10 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 12 maja 2013
    Posty: 568
    Zbananowany użytkownik

    Pomógł: 31

    C# za bardzo nie znam, ale jest bardzo zbliżony do C++ więc powinno się dać zrobić to samo.
    Jeśli masz bardzo dużo zmiennych w klasie to lepiej jest utworzyć wewnętrzną strukturę (struct) i w niej przechowywać dane.
    Jeśli chcesz kopiować dane pomiędzy obiektami utwórz konstruktor kopiujący i wtedy w momencie tworzenia obiektu możesz kopiować do niego dane z innego obiektu.
    Albo możesz przeciążyć operator (Operator Overloading) "=" i wtedy kopiujesz dane pomiędzy obiektami przy użyciu przypisania "=".

    _________________
    Und schreien

    Spring
    Erlöse mich
    Spring
    ...



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    PostNapisane: 6 sty 2015, o 14:38 
    Offline
    Użytkownik
    Avatar użytkownika

    Dołączył(a): 25 maja 2012
    Posty: 296
    Lokalizacja: Chebzie Dolne
    Zbananowany użytkownik

    Pomógł: 6

    Witam!
    O ile dobrze cię zrozumiałem to chcesz mieć wpływ na pola prywatne w jednej klasie z klasy drugiej.
    Po pierwsze w gwoli wyjaśnienia. Pole to a właściwość to dwie różne zmienne. Chociaż można stosować zamiennie, ale należy się
    trzymać konwencji jaka istnieje. Pola są zwykle prywatne, a właściwości publiczne i posiadają akcesory get i set.

    pole
    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    właściwość
    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Powoli przejdźmy do meritum sprawy. Aby mieć dostęp do pól z jednej klasy w drugiej przy zachowaniu hermetyzacji
    należy skorzystać z interfejsu. Co to takiego? generalnie jest to kontrakt, a klasa która impelmentuje interfejs musi go wypełnić
    czyli jeśli posiadamy w interfejsie jakieś pola, właściwości, metody to należy je zaimplementować. Takie są warunki kontraktu.

    A teraz bez tego miszmaszu. Stworzyłem dwie klasy i interfejs - KlasaPierwsza, KlasaDruga, i interfejs IPrzekazywanie


    KlasaPierwsza
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    jak widać nie ma tutaj nic do umówienia. Konstruktor klasy przyjmuje parametr typu I przekazywanie w głównym programie będzie widać o co chodzi


    Interfejs
    Składnia: [ Pobierz ] [ Ukryj ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    widzimy, że posiada 3 pola które nie posiadają modyfikatorów dostępu, a dlaczego tak jest to sobie doczytaj.

    KlasaDruga
    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    W KlasieDrugiej mamy pola prywatne do których nie mamy dostępu nigdzie indzie - private
    Zaimplementowaliśmy interfejs IPrzekazywanie. Widać to po dwukropku po nazwie klasy.

    Gółówny program

    Składnia: [ Pobierz ] [ Ukryj ] [ Zaznacz wszystko ]
    język csharp
    Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


    Tworzymy obiekt k2 klasy drugiej i do jej właściwości przypisujemy dane. Co automatycznie wypełnia nam pola prywatne w tej klasie (są one tutaj w sumie zbędne ale ich tez będzie można zmienić jeśli inna klasa będzie implementowała interfejs IPrzekazywanie).
    Następnie tworzony jest obiekt klasy pierwszej i tam jak wstawimy breakpointa zobaczymy ze mamy dane które ustawiliśmy dla właściwości w obiekcie drugim.

    Obrazek

    I to wszystko.

    _________________
    Inspekcja TV kanalizacji
    Programowanie



    Góra
     Zobacz profil  
    cytowanie selektywne  Cytuj  
    Wyświetl posty nie starsze niż:  Sortuj wg  
    Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 14 ] 

    Strefa czasowa: UTC + 1


    Kto przegląda forum

    Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


    Nie możesz rozpoczynać nowych wątków
    Nie możesz odpowiadać w wątkach
    Nie możesz edytować swoich postów
    Nie możesz usuwać swoich postów
    Nie możesz dodawać załączników

    Szukaj:
    Skocz do:  
    cron
    Sitemap
    Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
    phpBB SEO