Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C#] Funkcja w funkcji? - nie wiem jak to dokładnie nazwać

Adam Ś. 03 Sie 2012 23:43 1687 10
  • #1 03 Sie 2012 23:43
    Adam Ś.
    Poziom 12  

    Cześć.

    Mam takie pytanie. Dopiero zaczynam przygodę z C# i chciałbym o coś zapytać. Czy da się zrobić coś takiego że tworzymy kilka funkcji o takiej samej nazwie ale różniących się tym że po kropce dodajemy jakieś przyrostki? W sensie że podczas kodzenia odwołujemy się do takich funkcji w ten sposób:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Wymyśliłem to teraz tak na szybko aby zobrazować o co mi chodzi. Nie wiem czy tak się da i ewentualnie jak taki zabieg się nazywa więc nic na ten temat nie znalazłem w necie.

    A oto moja "wizja" jak wyglądała by definicja takich funkcji :D

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    oczywiście to nie działa ale ma służyć tylko jako zobrazowanie sytuacji :P

    Jaki byłby cel takiego zabiegu? A no taki że mając np. z 10 funkcji wchodzących w skład jakiegoś zbioru (np. tak jak tu "Log" - od logów) to podczas kodzenia wystarczyłoby napisać "Log." a środowisko samo by podpowiedziało listę dostępnych funkcji. Niby można tworzyć np. 10 funkcji który nazwiemy np. Log_Wyswietl; Log_Wyczysc; Log_Usun; ... ale to jest mniej przejrzyste. A jeżeli chcemy więcej to jeszcze gorzej :P

    Więc jak da radę coś takiego zrobić?

    0 10
  • Pomocny post
    #2 04 Sie 2012 00:14
    piored93
    Poziom 9  

    Zapewne chodzi Ci o operacje na klasach. Na googlach napewno coś znajdziesz.

    0
  • Pomocny post
    #3 04 Sie 2012 00:27
    marcinj12
    Poziom 40  

    Gwoli nazewnictwa: w C# używa się terminu metoda na to co nazywasz funkcją. A to o co pytasz to po prostu zdefiniowanie metod w klasie. W sumie rzecz podstawowa z podstawowych, skoro dopiero zaczynasz, przerób przynajmniej jakiś tutorial na necie albo książkę, bo bez tego będzie trudno...

    Generalnie tworzysz sobie klasę Log, niech będzie ona oraz jej metody publiczne i dodatkowo jawny konstruktor klasy:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    a w programie tworzysz nową instancję klasy i wywołujesz jej metody:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Drugim sposobem - może to mieć uzasadnienie w przypadku czegoś takiego jak log - jest utworzenie tej klasy jako statycznej, wtedy istnieje ona od początku uruchomienia programu i nie musisz tworzyć jej poleceniem new. Wszystkie metody w niej użyte też muszą być statyczne.
    Wtedy klasa wygląda tak:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    a w programie:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    0
  • #4 04 Sie 2012 00:33
    gaskoin
    Poziom 38  

    Trochę marcinie namieszałeś.

    Konstruktor w Twoim przykładzie nie jest potrzebny.
    W przypadku klasy statycznej - warto wspomnieć, że jest ona singletonem, natomiast klasy niestatyczne mogą mieć wiele instancji (może ich być wiele) i każdy obiekt z osobna będzie miał swój własny stan wewnętrzny.

    0
  • #5 04 Sie 2012 01:00
    marcinj12
    Poziom 40  

    gaskoin napisał:
    Konstruktor w Twoim przykładzie nie jest potrzebny.
    Potrzebny owszem, nie jest, ale skoro i tak zostanie domyślnie utworzony, czemu go nie umieścić jawnie? :) Kwestia nawyku i stylu, ja zawsze daję, tym bardziej że Kolega początkujący, niech wie że tam jest :)
    gaskoin napisał:
    W przypadku klasy statycznej - warto wspomnieć, że jest ona singletonem
    Jesteś pewien? Wszak gdyby tak było, nie było by rozróżnienia na wzorzec singleton i klasę statyczną... :) Po mojemu jakieś tam różnice są - ot, choćby singleton ma tylko jedną instancję - ale ma, może implementować interfejsy, być przekazywany jako parameter i w ogóle być traktowany jako "prawie normalny" obiekt. A w klasie statycznej żadne z powyższych nie może mieć miejsca i musisz ograniczyć się tylko do używania statycznych metod.

    0
  • #6 04 Sie 2012 10:38
    Adam Ś.
    Poziom 12  

    O to właśnie mi chodziło dzięki wielkie. Do tej pory nie miałem styczności z programowaniem obiektowym czy jakoś tak :P

    A mam jeszcze jedno pytanie tak z ciekawości, czy da się zrobić coś takiego

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    :D

    0
  • #7 04 Sie 2012 11:12
    marcinj12
    Poziom 40  

    Można, jeśli rozbijesz na dwie klasy...
    Przykład ze zwykłymi klasami (z uporem maniaka z konstruktorem - tym razem wykorzystywanym do utworzenia instancji klasy Usun ;P):

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    i wywołanie:
    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Na klasie statycznej już tego tak nie zrobisz, na nich nie robi się takich "łańcuchów zagnieżdżeń" tylko po prostu używa kiedy są potrzebne...

    0
  • #8 04 Sie 2012 13:01
    gaskoin
    Poziom 38  

    Adam - da się tak zrobić jak pisze @marcinj12, ale przyjęło się, że obiekty opisują hmmm... obiekty, czyli tak jakby rzeczy, a metody określają ich funkcjonalność. Z programistycznego punktu widzenia to, co wymyśliłeś jest poprawne, ale po czasie możesz dojść do wniosku, że robi się bardzo zawiłe i trudne w analizie. Do czego zmierzam - o ile obiekt Log jest sensowny, to obiekt Usun już tak sobie. Ja bym to widział tak:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Pamiętaj, że jak coś brzmi jak czasownik to jest to idealny kandydat na metodę a nie klasę. Poza tym poczytaj jakąś książkę do C# albo chociaż kurs w internecie, bo to o co pytasz to raczej podstawy podstaw.

    marcinj12 napisał:
    Jesteś pewien? Wszak gdyby tak było, nie było by rozróżnienia na wzorzec singleton i klasę statyczną... :) Po mojemu jakieś tam różnice są - ot, choćby singleton ma tylko jedną instancję - ale ma, może implementować interfejsy, być przekazywany jako parameter i w ogóle być traktowany jako "prawie normalny" obiekt. A w klasie statycznej żadne z powyższych nie może mieć miejsca i musisz ograniczyć się tylko do używania statycznych metod.


    Wiem o tym, chodziło mi o to, że masz tylko jeden statyczny obiekt. Nieprecyzyjnie się wyraziwszy.

    0
  • #9 04 Sie 2012 18:45
    Adam Ś.
    Poziom 12  

    gaskoin napisał:
    Z programistycznego punktu widzenia to, co wymyśliłeś jest poprawne, ale po czasie możesz dojść do wniosku, że robi się bardzo zawiłe i trudne w analizie. Do czego zmierzam - o ile obiekt Log jest sensowny, to obiekt Usun już tak sobie.


    Tutaj się troszkę z kolegą nie zrozumieliśmy. Ja nie chciałem tego rozbijać na kolejną osobną klasę tylko myślałem o czymś takim:

    Kod: csharp
    Zaloguj się, aby zobaczyć kod


    Ale jak się nie da to trudno :P Po prostu tak byłoby przejrzyście bo usuwanie wszystkich wpisów lub części kryło by się pod "Usun" :P Oczywiście to co ja tu pokazuję to tylko przykład bo tu są tylko te 3 metody :D a czasem trzeba więcej robić :P

    Aha i takie pytanie czy operowanie na metodach klas nie zajmuje więcej czasu niż na zwykłych funkcjach? Tzn czy zamiast tych metod nie lepiej by zrobić to na zwykłych funkcjach i nie bawić się w klasy, tylko wiem że wtedy nie da się robić odwołań typu "Log.Wyswietl"?

    0
  • #10 04 Sie 2012 19:01
    gaskoin
    Poziom 38  

    C# jest językiem obiektowym i pojęcie funkcji w nim właściwie nie występuje. Wszystko opiera się o obiekty, nie da się wywołać żadnej funkcji/metody bez powiązania z klasą. Jeśli Ci to nie odpowiada, tzn, że wybrałeś zły język :)

    Jeśli chodzi o obiekty statyczne i wywołania z nich metod tak, jak podałeś, to szybkość nie ma żadnego znaczenia. Oczywiście to też zależy (czy metoda wirtualna itd), ale dla Ciebie na razie nie będzie to miało żadnego znaczenia. Powiem tylko precyzyjniej, że różnica jest dwóch rozkazów asemblerowych(statyczna 1 rozkaz - call, niestatyczna 3 rozkazy - mov cmp call) i wprowadzany narzut jest mało istotny. Używanie klas statycznych powinno być ograniczone do niezbędnych zastosowań.

    0
  • #11 14 Wrz 2012 16:20
    ty221
    Poziom 10  

    Powinieneś utworzyć nową klasę Log i w niej umieścić te metody

    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    Potem się tak odwołujesz (w innej klasie)
    Kod: csharp
    Zaloguj się, aby zobaczyć kod

    I jest spoko.

    0