[C#] Obiekty w praktyce 7743 10

O temacie

Autor Remix

Zaczęty 13.08.2012 roku

Wyświetleń 7743

Odpowiedzi 10

Remix

Remix

Użytkownicy
Murzyn Internetów :O
posty291
Propsy41
ProfesjaProgramista
  • Użytkownicy
  • Murzyn Internetów :O
Siemka!

Od niedawna zacząłem się uczyć programowania w C#. Przyznam, podoba mi się ten język i bardzo dobrze mi się w nim pisze (plus wspaniałe środowisko :D ). W teori już w sumie obiekty ogarnąłem. Wiem że mogą pomiędzy sobą wymieniać dane itp. Jednak nie mogę jakoś wyobrazić sobie praktycznego zastosowania obiektów. Podajcie mi jeden przykład praktycznego zastosowani i mi go opiszcie jakby to miałoby wyglądać. Innymi słowy chodzi mi o to żebyście naprowadzili mój mózg na praktyczne myślenie :D

PS: Mam nadzieje że ktoś tu w C# programuje XD
 
https://www.youtube.com/watch?v=TNdy0ea6gc4

Ezzam

Ezzam

Użytkownicy
posty391
Propsy367
  • Użytkownicy

Ezzam

[C#] Obiekty w praktyce
#1 2012-08-13, 21:38(Ostatnia zmiana: 2012-08-13, 21:46)
Dam przykład z mojej nędznej gierczyny.

Jeśli chcę rekrutować jednostkę, tworzę nowy obiekt danej klasy zamiast tworzyć kolejny zestaw luźnych zmiennych.

Edit: Daleko nie trzeba szukać, w moim turorialu nt. XNA jest przykład praktycznego zastosowania klas: http://themodders.org/index.php?/topic/17881-podstawy-xna/
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
typowy przykład ze zwierzyńcem

Masz klasę zwierzę. Zwierzę może wydać głos i podać swoje imię(imie jest parametrem klasy zwierze, a wydawanie głosu metodą abstrakcyjną, czyli taką, której nie można wywołać, bo nie jest zdefiniowana. Należy ją zdefiniować na klasach potomnych). Tworzysz klasy dziedziczące po zwierzęciu. Kot, który wydając głos mówi "miau" i ma metodę "wskocz na szafę". Pies mówi "hau" i ma metodę aportuj. Tworzymy sobie listę zwierzaków. Możemy do niej wrzucać zarówno psy i koty (jak i inne obiekty klas dziedziczących po zwierzęciu). Możemy teraz stworzyć sobie kilka kotów i kilka psów. Powiedzmy, że koty będą się nazywały "Filemon" i "Bonifacy" a psy "Reksio" i "Pluto". Możemy teraz pętlą foreach poprosić każde zwierzę o wydanie głosu (Bo zwierze posiada taką metodę) i otrzymamy dwa razy "hau" i dwa razy "miau", bo program wykona dwa razy kod metody "wydaj głos" napisany w psie i dwa razy w kocie. Ponadto możemy na tej liście wywołać metodę zwracającą imiona. Możemy też kazać konkretnemu psu aportować, ale nie możemy tego nakazać żadnemu kotu.

Chyba napiszę kod do tego bo się to okrutnie tłumaczy tak na sucho.
 
Popisuje się ciągle menda jedna...

inż. Avallach

inż. Avallach

Administrator
posty7661
Propsy5239
NagrodyV
ProfesjaProgramista
  • Administrator
Inny przykład, mam obiekt "konsola" (który jest w praktyce singletonem, jedynym obiektem klasy), albo obiekt "słońce" klasy "gwiazda" zawierający dane tej gwiazdy które mogą być wyświetlone w oknie edytora, a także mają wizualne odwzorowanie w przestrzeni 3d.

muttley

muttley

Użytkownicy
posty567
Propsy381
  • Użytkownicy
Jednak nie mogę jakoś wyobrazić sobie praktycznego zastosowania obiektów.
Przyjdzie z czasem, jakikolwiek większy projekt i dzięki obiektom masz zajebistą organizację + to co napisał Fartuess.

@Allach
Nie tłumacz mu co to singleton :D
Do mnie to dotarło dopiero wtedy jak troszkę porobiłem przy Ogre3D
 

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Przecież singleton to najprostszy z wzorców projektowych  :lol:  . Ale fakt - na początku nie ma co o nich opowiadać.
 
Popisuje się ciągle menda jedna...

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ObiektowoscPrzyklad
{

    public abstract class Zwierze //klasa macierzysta. Jest ona klasą abstrakcyjną, czyli nie można stworzyć zwierzęcia bezgatunkowego. Poza tym istnienie w klasie metody abstrakcyjnej wymusza na klasie bycie abstrakcyjną.
    {
        protected string imie;//parametr zwierzaka. Dziedziczące klasy też go posiadają.
        public void podajImie()
        {
            Console.WriteLine("Mam na Imię " + imie);
        }
        public abstract string dajGlos();//metoda abstrakcyjna. Każda klasa dziedzicząca po Zwierzęciu musi zdefiniować co robi metoda dajGlos(). W przeciwnym wypadku dziedzicząca klasa też musi być abstrakcyjna.

        protected Zwierze(string imieZwierzaka)//konstruktor klasy zwierze. Mówi jakie mamy podać konstruktory by móc stworzyć obiekt dane klasy i jaki kod będzie wtedy wykonany. Jeśli nie podamy konstruktora, to domyślnie kompilator tworzy domyślny konstruktor bezparametrowy.
        {
            this.imie = imieZwierzaka;//this oznacza odwołanie obiektu do samego siebie. Często można pominąć.
        }
    }

    public class Kot : Zwierze //ta klasa dziedziczy po zwierzęciu. W końcu kot to zwierze prawda?
    {
        public string kolorFutra;   //nowy parametr. Inne zwierzęta go nie mają.

        override public string dajGlos()    //nadpisujemy tutaj klasę abstrakcyjną
        {
            return "Miau";
        }

        public void skoczNaSzafe()  //nowa metoda. Mogą jej używać tylko koty
        {
            Console.WriteLine("Skoczyłem na Szafe");
        }

        public Kot(string imieZwierzaka)
            : base(imieZwierzaka)           //dopisek base oznacza, że konstruktor klasy dziedziczącej nie nadpisuje konstruktora klasy głównej o tych samych parametrach, tylko ą rozszerza
        {
            kolorFutra = "czarny";//zakładamy, że jak nie podamy koloru futra kot, to jest on czarny
        }

        public Kot(string imieZwierzaka, string kolor)  //możemy mieć dwa konstruktory o różnych parametrach i różnym kodzie wewnątrz nich. Progra użye tego, który będzie pasował do podanych parametrów
            : base(imieZwierzaka)                      
        {
            kolorFutra = kolor;
        }
    }

    public class Pies : Zwierze //klasa dziedzicząca
    {
        override public string dajGlos() //implementacja klasy abstrakcyjne
        {
            return "Hau";
        }

        public void aportuj()   //nowa metoda dla psa
        {
            Console.WriteLine("Wee! Piłeczka!");
        }

        public Pies(string imie)    //Pies używa tak samo działającego konstruktora jak ten zdefiniowany w zwierzęciu
            : base(imie)
        {

        }

    }

    class Program
    {
        static void Main(string[] args)
        {
            List<Zwierze> Schronisko = new List<Zwierze>(); //tworzymy obiekt klasy List. Nie ma go zdefiniowanego u nas, ale jest to klasa należąca do bibliotek C#. W tym przyopadku jest to lista zwierząt
            Kot kot1 = new Kot("Bonifacy");//tworzymy kota o imieniu Bonifacy, który korzysta z pierwszego konstruotra
            Kot kotdrugi = new Kot("Filemon", "biały");//i drugiego kota korzystającego z drugiego konstruktora
            Pies reksio = new Pies("Reksio");//podobnie robimy z psami
            Pies Pluto = new Pies("Pluto");

            Schronisko.Add(kot1);//Add jest metodą klasy List. Pozwala dodawać obiekty do siebie będące odpowiedniego typu. Kot jest zwierzęciem, więc lista go akceptuje. Mamy tu doczynienia z czymś nazywanym polimorfizmem (W sensie, że Kot jest zwierzęciem właśnie)
            Schronisko.Add(kotdrugi);
            Schronisko.Add(reksio);//Pies też jest zwierzęciem
            Schronisko.Add(Pluto);

            foreach (Zwierze x in Schronisko)   //pętla wykonująca kod dla każdego zwierzęcia w Liście Schronisko
            {
                x.podajImie();  //każde zwierze na liście poda swoe imie
                Console.WriteLine(x.dajGlos()); //i da głos
            }

            Console.WriteLine(kot1.kolorFutra); //koty dodatkowo mogą podać kolor futra. Tym razem nie każemy kotu wykonać metody, tylko podać wartość parametru
            Console.WriteLine(kotdrugi.kolorFutra);

            kot1.skoczNaSzafe(); //inne metody kotów i psów.
            kotdrugi.skoczNaSzafe();
            reksio.aportuj();
            Pluto.aportuj();
        }
    }
}

A to efekt działania programu:



W game devie zazwycza obiektowość jest wykorzystywana jest w następujący sposób.

Mamy klasę gameObject. Jej obiekty mogą zaktualizować swoje parametry i wykonać działanie przy użyciu metody "Update()" oraz zostać narysowane przy użyciu metody "Draw". Możemy stworzyć kasy pochodne od gameObject takie jak "Player", "Monster", "PowerUP" czy "Light" i wszystkie wrzucić na listę game objectów. Co klatką po prostu wykonujemy update dla całej listy i draw dla całej listy. Każdy obiekt zupdate'uje i narysuje się w sposób jemu przypisany. Update i Draw wykonywane są co klatkę. Tak mniej więcej działają gry :)
 
Popisuje się ciągle menda jedna...

Remix

Remix

Użytkownicy
Murzyn Internetów :O
posty291
Propsy41
ProfesjaProgramista
  • Użytkownicy
  • Murzyn Internetów :O
No muszę przyznać że świetnie mnie naprowadziliście :D

@UP Wielkie dzięki za to że nawet napisałeś kod by mi to zobrazowaćw teori (choć w teori wiem ale i tak dzięki za poświęcenie :D )

Temat OFF
 
https://www.youtube.com/watch?v=TNdy0ea6gc4

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Chciałem zaprezentować różne mechanizmy związane z obiektowością. Wnioskowałem, że ich nie znasz/nie rozumiesz skoro nie możesz znaleźć praktycznego zastosowania dla obiektowości.
 
Popisuje się ciągle menda jedna...

Remix

Remix

Użytkownicy
Murzyn Internetów :O
posty291
Propsy41
ProfesjaProgramista
  • Użytkownicy
  • Murzyn Internetów :O
Nie no teorie znałem. Tylko jakoś mojego mózgu do praktyki nie przystosowałem :D

Poza tym dopiero się ucze to mam prawo czegoś nie kapować :D
 
https://www.youtube.com/watch?v=TNdy0ea6gc4

mgr Fartuess

mgr Fartuess

Użytkownicy
Kiedyś to były czasy!
posty1485
Propsy890
ProfesjaProgramista
  • Użytkownicy
  • Kiedyś to były czasy!
Spoko. Miałem podobnie na początku :) . Dopiero projekt na kole naukowym mnie do tego naprawdę dobrze wprowadził.
 
Popisuje się ciągle menda jedna...


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry