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



Teraz jest 4 gru 2024, o 20:24


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: 265
Lokalizacja: Szczecin
Pomógł: 9

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

Np:
public string OpisModulu {get;set;}

_________________
www.iuvo.it - Automatyka Budynkowa



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 ]
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 ]
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 ]
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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO