{"id":28393,"date":"2022-02-07T09:00:00","date_gmt":"2022-02-07T06:00:00","guid":{"rendered":"https:\/\/mobidictum.com\/?p=28393"},"modified":"2023-04-25T10:43:18","modified_gmt":"2023-04-25T07:43:18","slug":"unity-3d-nesne-yonelimli-programlama-inheritance-nedir","status":"publish","type":"post","link":"https:\/\/mobidictum.com\/tr\/unity-3d-nesne-yonelimli-programlama-inheritance-nedir\/","title":{"rendered":"Unity 3D ile Nesne Y\u00f6nelimli Programlama 03: Inheritance nedir?"},"content":{"rendered":"\n<p>Unity 3D ile Nesne Y\u00f6nelimli Programlama serisinin \u00fc\u00e7\u00fcnc\u00fcs\u00fcnde \u201cinheritance\u201d\u0131 konu al\u0131yoruz. <\/p>\n\n\n\n<p>Inheritance, en basit anlat\u0131m\u0131yla bir nesnenin \u00f6zelliklerini, t\u00fcretildi\u011fi bir ba\u015fka nesneden miras almas\u0131d\u0131r. G\u00fcnl\u00fck hayattan \u00f6rnek vermek gerekirse hepimiz fiziksel ve\/veya genetik \u00f6zelliklerimizi anne ve babam\u0131zdan miras al\u0131r\u0131z. Bir insan, insan olma, \u00f6zelliklerini biyolojik anlamda primatlardan, primatlar ise memeli hayvanlar s\u0131n\u0131f\u0131ndan benzer \u00f6zellikleri miras al\u0131rlar. Bu temel ak\u0131\u015f\u0131 istersek karbon atomlar\u0131na kadar takip edebiliriz. Peki bunu programlama esnas\u0131nda nas\u0131l kullan\u0131r\u0131z nas\u0131l anlat\u0131r\u0131z?<\/p>\n\n\n\n<p>\u00d6ncelikle kendimize bir senaryo olu\u015ftural\u0131m.<\/p>\n\n\n\n<p>Oyunumuzda y\u00f6netti\u011fimiz bir karakterin oldu\u011funu ve bu karakterin d\u00fc\u015fman karakterleri oldu\u011funu. Kendi karakterimizin ve d\u00fc\u015fmanlar\u0131n birbirine ate\u015f etti\u011fini ve canlar\u0131n\u0131n azald\u0131\u011f\u0131n\u0131 farzedelim.<\/p>\n\n\n\n<p>Inheritance olmadan bu iki objenin s\u0131n\u0131flar\u0131n\u0131 a\u015fa\u011f\u0131daki gibi yazard\u0131k.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">public class Player\r\n{\r\n    public string name;\r\n    public int health;\r\n    public int damage;\r\n    public bool isDie;\r\n\r\n    public void HitDamage(int enemyDamage)\r\n    {\r\n        health -= enemyDamage;\r\n        if (health <= 0)\r\n        {\r\n            isDie = true;\r\n        }\r\n        else\r\n        {\r\n            isDie = false;\r\n        }\r\n    }\r\n}\r\n\r\npublic class Enemy\r\n{\r\n    public string name;\r\n    public int health;\r\n    public int damage;\r\n    public bool isDie;\r\n\r\n    public void HitDamage(int enemyDamage)\r\n    {\r\n        health -= enemyDamage;\r\n        if (health <= 0)\r\n        {\r\n            isDie = true;\r\n        }\r\n        else\r\n        {\r\n            isDie = false;\r\n        }\r\n    }\r\n}\r\n\r\npublic class Main\r\n{\r\n    public Main()\r\n    {\r\n        Player player = new Player();\r\n        player.name = \"MyHero\";\r\n        player.health = 100;\r\n        player.damage = 10;\r\n        player.isDie = false;\r\n\r\n        Enemy enemy = new Enemy();\r\n        enemy.name = \"enemy1\";\r\n        enemy.health = 80;\r\n        enemy.damage = 5;\r\n        enemy.isDie = false;\r\n        \r\n        player.HitDamage(enemy.damage);\r\n        \r\n    }\r\n}\r<\/pre>\n\n\n\n<p>Player ve Enemy hasar (damage) ald\u0131klar\u0131nda canlar\u0131 (health) s\u0131f\u0131r veya s\u0131f\u0131rdan k\u00fc\u00e7\u00fck oldu\u011funda karakter \u00f6lm\u00fc\u015f oluyor.<\/p>\n\n\n\n<p>Bu iki s\u0131n\u0131f\u0131 (class) inceledi\u011fimizde ayn\u0131 \u00f6zelliklere sahip alanlar ve ayn\u0131 i\u015flemi yapan \u201cHitDamage\u201d metodumuz var. Peki bir s\u0131n\u0131f\u0131m\u0131z olsa ve Player ve Enemy s\u0131n\u0131flar\u0131n\u0131n \u00f6zelliklerini ta\u015f\u0131sayd\u0131 bu senaryoyu nas\u0131l yazard\u0131k?<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">public class BaseCharacter\r\n{\r\n    public string name;\r\n    public int health;\r\n    public int damage;\r\n    public bool isDie;\r\n\r\n    public void HitDamage(int enemyDamage)\r\n    {\r\n        health -= enemyDamage;\r\n        if (health <= 0)\r\n        {\r\n            isDie = true;\r\n        }\r\n        else\r\n        {\r\n            isDie = false;\r\n        }\r\n    }\r\n}\r\n\r\npublic class Main\r\n{\r\n    public Main()\r\n    {\r\n        BaseCharacter player = new BaseCharacter();\r\n        player.name = \"MyHero\";\r\n        player.health = 100;\r\n        player.damage = 10;\r\n        player.isDie = false;\r\n\r\n        BaseCharacter enemy = new BaseCharacter();\r\n        enemy.name = \"enemy1\";\r\n        enemy.health = 80;\r\n        enemy.damage = 5;\r\n        enemy.isDie = false;\r\n        \r\n        player.HitDamage(enemy.damage);\r\n\r\n    }\r\n}\r<\/pre>\n\n\n\n<p>Burada BaseCharacter s\u0131n\u0131f\u0131ndan iki nesne tan\u0131mlad\u0131k. player ve enemy nesneleri BaseCharacter t\u00fcr\u00fcnde. Bu son \u00f6rnek ile bir \u00f6nceki \u00f6rnek bize ayn\u0131 sonucu verecektir.<\/p>\n\n\n\n<p>Ad\u0131m ad\u0131m inheritance\u2019a geliyoruz. \u015eimdi, benim istedi\u011fim, oyuncunun (player) bir z\u0131rh\u0131 (armor) olsun ve hasar ald\u0131\u011f\u0131nda z\u0131rh\u0131n de\u011feri s\u0131f\u0131r olana kadar can\u0131n\u0131z azalmas\u0131n. Bu noktada oyuncu i\u00e7in istedi\u011fim \u00f6zellikleri BaseCharacter s\u0131n\u0131f\u0131m tam olarak kar\u015f\u0131layam\u0131yor. Fakat Enemy s\u0131n\u0131f\u0131n\u0131 da BaseCharacter \u00fczerinden t\u00fcretti\u011fim i\u00e7in, Enemy\u2019nin bu \u00f6zelliklere sahip olmas\u0131n\u0131 istemiyorum. O zaman Player s\u0131n\u0131f\u0131m\u0131za geri d\u00f6n\u00fcp biraz de\u011fi\u015fiklikler yapal\u0131m. Player s\u0131n\u0131f\u0131n\u0131n BaseCharacter s\u0131n\u0131f\u0131n\u0131n \u00f6zelliklerini ta\u015f\u0131mas\u0131n\u0131 istedi\u011fim i\u00e7in BaseCharacter s\u0131n\u0131f\u0131ndan t\u00fcretece\u011fim.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">public class Player : BaseCharacter\r\n{\r\n    public int armor;\r\n\r\n    public int HitArmor(int enemyDamage)\r\n    {\r\n        armor -= enemyDamage;\r\n        return armor;\r\n    }\r\n}\r\n\r\npublic class Enemy : BaseCharacter\r\n{\r\n}\r\n\r\npublic class Main\r\n{\r\n    public Main()\r\n    {\r\n        Player player = new Player();\r\n        player.name = \"MyHero\";\r\n        player.health = 100;\r\n        player.damage = 10;\r\n        player.armor = 100;\r\n        player.isDie = false;\r\n\r\n        BaseCharacter enemy1 = new BaseCharacter();\r\n        enemy1.name = \"enemy1\";\r\n        enemy1.health = 80;\r\n        enemy1.damage = 5;\r\n        enemy1.isDie = false;\r\n\r\n        Enemy enemy2 = new Enemy();\r\n        enemy2.name = \"enemy2\";\r\n        enemy2.health = 80;\r\n        enemy2.damage = 5;\r\n        enemy2.isDie = false;\r\n        \r\n        int playerArmor = player.HitArmor(enemy1.damage);\r\n        playerArmor = player.HitArmor(enemy2.damage);\r\n\r\n        if (playerArmor <= 0)\r\n        {\r\n            player.HitDamage(enemy.damage);\r\n            player.HitDamage(enemy2.damage);\r\n        }\r\n\r\n        enemy1.HitDamage(player.damage);\r\n        enemy2.HitDamage(player.damage);\r\n    }\r\n}\r<\/pre>\n\n\n\n<p>B\u00f6ylece Player s\u0131n\u0131f\u0131m hem BaseCharacter s\u0131n\u0131f\u0131n\u0131n \u00f6zelliklerini ta\u015f\u0131yor hem de kendine \u00f6zel olarak \u201carmor\u201d \u00f6zelli\u011fine sahip. Enemy s\u0131n\u0131f\u0131 ise ek bir \u00f6zelli\u011fe sahip olmadan BaseCharacter s\u0131n\u0131f\u0131ndan t\u00fcretilmi\u015f ve t\u00fcm \u00f6zelliklerini ta\u015f\u0131yor. Dikkat ettiyseniz, enemy1 BaseCharacter tipinde enemy2 ise Enemy tipinde bir nesne. Fakat birebir ayn\u0131 \u00f6zellikleri ta\u015f\u0131yor. Enemy s\u0131n\u0131f\u0131n\u0131 olu\u015fturmayabilirdim de. \u0130htiya\u00e7 duymuyor, gerek yoksa, anlams\u0131z yere kod karma\u015fas\u0131 olu\u015fturmamaya \u00e7al\u0131\u015fal\u0131m. Burada konuyu anlatabilmek i\u00e7in \u00f6rnek olarak yaratt\u0131m. <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/mobidictum.com\/wp-content\/uploads\/2022\/02\/inheritance.png\" alt=\"unity oop inheritance\" class=\"wp-image-28396\" width=\"438\" height=\"393\" srcset=\"https:\/\/mobidictum.com\/wp-content\/uploads\/2022\/02\/inheritance.png 386w, https:\/\/mobidictum.com\/wp-content\/uploads\/2022\/02\/inheritance-300x269.png 300w, https:\/\/mobidictum.com\/wp-content\/uploads\/2022\/02\/inheritance-380x341.png 380w\" sizes=\"(max-width: 438px) 100vw, 438px\" \/><figcaption>Inheritance<\/figcaption><\/figure><\/div>\n\n\n\n<p>Enemy nesnesine ek olarak ba\u015fka \u00f6zellikler eklemek istedi\u011fimde bu Enemy s\u0131n\u0131f\u0131na yazabilirim. \u00d6rnek, olarak Enemy t\u00fcp\u00fcnde nesnelerin \u201cboss\u201d olup olmad\u0131\u011f\u0131n\u0131 a\u015fa\u011f\u0131daki gibi eklersem enemy2 bu \u00f6zelli\u011fi kullanamayacakt\u0131. Bunun i\u00e7in enemy2\u2019yi a\u015fa\u011f\u0131daki gibi yazmam gerekecekti.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">public class Enemy : BaseCharacter\r\n{\r\n    public bool _isBoss;\r\n}\r\n\r\npublic class Main\r\n{\r\n    public Main()\r\n    {\r\n        \r\n        Enemy enemy1 = new Enemy();\r\n        enemy1.name = \"enemy1\";\r\n        enemy1.health = 80;\r\n        enemy1.damage = 5;\r\n        enemy1.isDie = false;\r\n        enemy1.isBoss = true;\r\n\r\n        Enemy enemy2 = new Enemy();\r\n        enemy2.name = \"enemy2\";\r\n        enemy2.health = 80;\r\n        enemy2.damage = 5;\r\n        enemy2.isDie = false;\r\n        enemy2.isBoss = false;\r\n        \r\n        BaseCharacter enemy3 = new BaseCharacter();\r\n        enemy3.name = \"enemy3\";\r\n        enemy3.health = 80;\r\n        enemy3.damage = 5;\r\n        enemy3.isDie = false;\r\n\r\n\/\/ isBoss BaseCharacter de bulunmuyor\r\n\/\/ bu sat\u0131rda hata olu\u015fur.\r\n        enemy3.isBoss = false; \r\n\r\n    }\r\n}\r<\/pre>\n\n\n\n<p>\u015eimdiye kadar Player ve Enemy s\u0131n\u0131flar\u0131 i\u00e7in yazd\u0131klar\u0131m\u0131zla daha \u00e7ok oynay\u0131p bu s\u0131n\u0131flar\u0131 daha farkl\u0131 yazabilirdik. \u0130leride bahsedece\u011fim konularda \u00f6rnek vermek \u00fczere \u015fimdilik burada kendimi durduruyorum.<\/p>\n\n\n\n<p>\u00d6zet olarak <strong>inheritance<\/strong>, bir s\u0131n\u0131f\u0131n \u00f6zelliklerinin ve metotlar\u0131n\u0131n ba\u015fka s\u0131n\u0131flara aktararak i\u015flevlerinin artt\u0131r\u0131lmas\u0131n\u0131 sa\u011flar. Olu\u015fturulan ve genel \u00f6zellikleri i\u00e7eren s\u0131n\u0131fa \u201c<strong>base class\u201d (BaseCharacter)<\/strong>, ondan miras al\u0131narak \u00f6zelle\u015ftirilen alt s\u0131n\u0131fa \u201c<strong>derived class\u201d (Player ve Enemy)<\/strong> denir. Inheritance\u2019da, birbirine benzeyen s\u0131n\u0131flar\u0131 ayr\u0131 ayr\u0131 yazmak yerine, sahip olduklar\u0131 ortak \u00f6zellikleri belirleyerek bir \u201cbase class\u201d olu\u015fturur ve ondan t\u00fcreyen \u201cderived class\u201dlar\u0131n hizmetine sunar. Geri kalan \u00f6zellikleri base class\u2019dan t\u00fcretilen derived class\u2019larda yazmam\u0131z\u0131 sa\u011flar. B\u00f6ylece temelde de\u011fi\u015ftirmek istedi\u011fimiz veya d\u00fczeltmek istedi\u011fimiz bir \u00f6zelli\u011fi sadece base class\u2019da (BaseCharacter) de\u011fi\u015ftirerek, di\u011ferlerine de miras yoluyla bu de\u011fi\u015fikli\u011fi aktarm\u0131\u015f oluruz.<\/p>\n\n\n\n<p><strong>Dikkat:<\/strong> Bir s\u0131n\u0131f\u0131nbirden fazla base class\u2019\u0131 olamaz, sadece bir tane class\u2019dan t\u00fcretilebilir.<\/p>\n\n\n\n<p>Unity i\u00e7erisinde, Hierarchy\u2019de bulunan, gameobject\u2019lere ba\u011flad\u0131\u011f\u0131m\u0131z s\u0131n\u0131f\u0131nda dikkat ettiyseniz MonoBehaviourclass\u0131\u2019n\u0131n derived class\u2019lar\u0131d\u0131r. B\u00f6ylece transform, gameObject, StartCoroutine, Invoke gibi \u00f6zelliklerine eri\u015febiliriz. Peki MonoBehaviour hangi class\u2019lar\u0131n \u00f6zelliklerini miras al\u0131yor? Merak ediyorsan\u0131z fare imlecinizi MonoBehaviour \u00fczerine getirerek MacOS da Command + Left Click veya Windows\u2019da Ctrl + Left Click tu\u015f kombinasyonlar\u0131 ile g\u00f6rebilirsiniz.<\/p>\n\n\n\n<p>Ak\u0131\u015f \u015fu \u015fekilde olacakt\u0131r:<\/p>\n\n\n\n<p>MonoBehaviour \u2192 Behaviour \u2192 Component \u2192 Object<\/p>\n\n\n\n<p>Dolay\u0131s\u0131yla MonoBehaviour dan bir s\u0131n\u0131f t\u00fcretti\u011finizde Object s\u0131n\u0131f\u0131na kadar (Object dahil) izin verilen \u00f6zelliklere eri\u015fim sa\u011flayabilecek, ve b\u00fct\u00fcn \u00f6zelliklerini ta\u015f\u0131yacaks\u0131n\u0131z demektir. Bu bilgileri ileride kendi ki\u015fisel \u201ccomponent\u201dlerimizi yazarken kullanaca\u011f\u0131z.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Unity 3D ile Nesne Y\u00f6nelimli Programlama yaz\u0131 serisinin bu b\u00f6l\u00fcm\u00fcnde &#8220;inheritance&#8221; tan\u0131m\u0131n\u0131 ve kullan\u0131m\u0131n\u0131 i\u015fliyoruz.<\/p>\n","protected":false},"author":50,"featured_media":28398,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[8875],"tags":[],"class_list":["post-28393","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-akademi"],"acf":[],"_links":{"self":[{"href":"https:\/\/mobidictum.com\/tr\/wp-json\/wp\/v2\/posts\/28393","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mobidictum.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mobidictum.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mobidictum.com\/tr\/wp-json\/wp\/v2\/users\/50"}],"replies":[{"embeddable":true,"href":"https:\/\/mobidictum.com\/tr\/wp-json\/wp\/v2\/comments?post=28393"}],"version-history":[{"count":1,"href":"https:\/\/mobidictum.com\/tr\/wp-json\/wp\/v2\/posts\/28393\/revisions"}],"predecessor-version":[{"id":152199,"href":"https:\/\/mobidictum.com\/tr\/wp-json\/wp\/v2\/posts\/28393\/revisions\/152199"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/mobidictum.com\/tr\/wp-json\/wp\/v2\/media\/28398"}],"wp:attachment":[{"href":"https:\/\/mobidictum.com\/tr\/wp-json\/wp\/v2\/media?parent=28393"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mobidictum.com\/tr\/wp-json\/wp\/v2\/categories?post=28393"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mobidictum.com\/tr\/wp-json\/wp\/v2\/tags?post=28393"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}