Typy obiektowe - jak je zrozumieć ?

0

Cześć !

Programuję sobie od jakiegoś czasu w Javie i od samego początku głowię się nad tym czym są typy obiektowe ?

Czym na przykład różni się ten kod:

Player player = new Player();

od tego:

GameObject player = new Player();

dodanie znaczników <code class="java"> - Furious Programming

1

Polimorfizm. Klasa Player dziedziczy po GameObject i może być traktowana jako jedna z nich.

Ogólnie: jeśli stworzysz obiekt GameObject przez GameObject player = new Player(), to metody i pola z Player nie będą widoczne dla instancji tego obiektu. Poniższy kod pokazuje działanie.

        class Player : GameObject
        {
            public void PlayerMethod(){}
        }

        class GameObject
        {
            public void GameObjectMethod(){}
        }

        static void Main(string[] args)
        {
            Player player = new Player();
            player.PlayerMethod();
            player.GameObjectMethod();

            GameObject playerAsGameObject = new Player();
            playerAsGameObject.GameObjectMethod();
            playerAsGameObject.PlayerMethod(); //niedostepne, nie skompiluje
            ((Player)playerAsGameObject).PlayerMethod();//dostepne po rzutowaniu
        }
1

W pierwszym tworzysz zmienną typu Player, w drugim typu GameObject. Drugie jest możliwe dlatego, że Player dziedziczy z GameObject.

0
ulong88 napisał(a):

Polimorfizm. Klasa Player dziedziczy po GameObject i może być traktowana jako jedna z nich.

Ogólnie: jeśli stworzysz obiekt GameObject przez GameObject player = new Player(), to metody i pola z Player nie będą widoczne dla instancji tego obiektu. Poniższy kod pokazuje działanie.

        class Player : GameObject
        {
            public void PlayerMethod(){}
        }

        class GameObject
        {
            public void GameObjectMethod(){}
        }

        static void Main(string[] args)
        {
            Player player = new Player();
            player.PlayerMethod();
            player.GameObjectMethod();

            GameObject playerAsGameObject = new Player();
            playerAsGameObject.GameObjectMethod();
            playerAsGameObject.PlayerMethod(); //niedostepne, nie skompiluje
            ((Player)playerAsGameObject).PlayerMethod();//dostepne po rzutowaniu
        }

Czyli kiedy zmienna "player" jest referencją do obiektu Player() typu GameObject, to w tym momencie, jeśli nie zrzutuję zmiennej do typu Player, nie mam możliwości korzystania z ŻADNYCH metod, stanów itp itd. które są w klasie Player ?

po prostu jeśli chce się do niej dostać, muszę rzutować tak ?

1

Player() to nie obiekt, a jego metoda (konstruktor ściślej mówiąc). która tworzy instancję obiektu typu Player zapisując wskaźnik do utworzonego obiektu w zmiennej player. Ale, ponieważ zadeklarowałeś dla zmiennej inny typ, niż faktycznie został przypisany, musisz dokonać rzutowania, żeby mieć dostęp do pól i metod faktycznie utworzonego obiektu. których nie ma w typie zadeklarowanym.

0

Dobra, już rozumiem, dzięki za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1