﻿
{"id":2990,"date":"2014-08-13T16:12:18","date_gmt":"2014-08-13T16:12:18","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=2990"},"modified":"2019-02-08T21:22:00","modified_gmt":"2019-02-08T21:22:00","slug":"cta-coklu-kalitimmultiple-inheritance","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/cta-coklu-kalitimmultiple-inheritance\/","title":{"rendered":"C#&#8217;ta \u00c7oklu Kal\u0131t\u0131m(Multiple Inheritance)"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Her C# yaz\u0131l\u0131mc\u0131s\u0131n\u0131n bildi\u011fi gibi &#8220;Inheritance&#8221; konusunda tek tip kal\u0131t\u0131m s\u00f6z konusudur.Yani bir s\u0131n\u0131f sadece ve sadece bir s\u0131n\u0131ftan t\u00fcreyebilir.Bu gelenek .NET mimarisinin \u00e7oklu kal\u0131t\u0131ma izin veren C++ dilindeki &#8220;Diamond Problem&#8221; isimli hatay\u0131 ibret almas\u0131ndan dolay\u0131 kaynaklanmaktad\u0131r.Bu yaz\u0131mda C#&#8217;ta \u00e7oklu kal\u0131t\u0131m\u0131n nas\u0131l yap\u0131laca\u011f\u0131n\u0131 inceleyece\u011fiz.Sizlerin &#8220;<em>Interface yap\u0131s\u0131yla bu i\u015flemi hallediyoruz zaten<\/em>&#8221; gibi  s\u00f6ylendi\u011finizi duyar gibiyim.Lakin bu yaz\u0131n\u0131n ana \u015fablonu \u00e7oklu kal\u0131t\u0131m\u0131 interface yap\u0131lar\u0131yla de\u011fil, s\u0131n\u0131f yap\u0131lar\u0131yla g\u00f6stermektir.\u015eimdi gelin C#&#8217;ta \u00e7oklu kal\u0131t\u0131m konusunu yasaklanma sebepleriyle beraber ele alal\u0131m.<br \/>\n<!--more--><br \/>\nC++ dilinde bir s\u0131n\u0131f\u0131n birden fazla s\u0131n\u0131ftan kal\u0131t\u0131m alabildi\u011fini yukar\u0131larda bahsetmi\u015ftik.Kal\u0131t\u0131m hiyerar\u015fisinde bulunan base s\u0131n\u0131flarda virtual yap\u0131lar\u0131na sahip elemanlar varsa e\u011fer ve bu base s\u0131n\u0131flardan kal\u0131t\u0131m alan tekil s\u0131n\u0131flar virtual s\u0131n\u0131flar\u0131 eziyorsa(override) bir s\u0131k\u0131nt\u0131 s\u00f6z konusu de\u011fildir.Lakin bu derived class yap\u0131lar\u0131na sahip s\u0131n\u0131flar C++ \u00f6zelli\u011fi gere\u011fince tek s\u0131n\u0131fa \u00e7oklu kal\u0131t\u0131m vererek o s\u0131n\u0131fta da base classlardan gelen virtual metod override edilirse e\u011fer i\u015fte burada C++ dilinin kafas\u0131 kar\u0131\u015f\u0131yor ve derleyici hata veriyor.Bunun sebebi, \u00e7oklu kal\u0131t\u0131m alan s\u0131n\u0131f\u0131n override etti\u011fi eleman\u0131 hangi \u00fcst s\u0131n\u0131ftan ald\u0131\u011f\u0131n\u0131 mimarinin bilememesidir.<\/p>\n<p>\u0130\u015fte bu olas\u0131 duruma C++ dilinde &#8220;Diamond Problem&#8221; ismi verilmektedir.<\/p>\n<p>Bu anlat\u0131m\u0131n ne kadar kar\u0131\u015f\u0131k ve anlamas\u0131 zor oldu\u011funu biliyorum.Ama konumuzu s\u0131rf bu hata sebebine odaklamamak i\u00e7in bu tarz bir anlat\u0131mdan sonra aktarmak istedi\u011fim ana konuya giri\u015f yapmak istiyorum.<\/p>\n<p>C# dilinde \u00e7oklu kal\u0131t\u0131m yapabilmenin birinci yolu interface yap\u0131lar\u0131n\u0131 kullanabilmekten ge\u00e7er.K\u0131saca de\u011finmek gerekirse, C# mimarisinde bir s\u0131n\u0131f sadece ve sadece bir s\u0131n\u0131ftan t\u00fcreyebilir ama bir ve birden fazla interface yap\u0131s\u0131ndan da kal\u0131t\u0131m alabilir.<\/p>\n<p>Bu yaz\u0131n\u0131n ana konusu olan ikinci yola gelirsek e\u011fer bunu somut kodlarla g\u00f6stermek daha faydal\u0131 olacakt\u0131r.<br \/>\n&#8220;A.cs&#8221;, &#8220;B.cs&#8221; ve &#8220;C.cs&#8221; isimli \u00fc\u00e7 adet s\u0131n\u0131f olu\u015ftural\u0131m ve i\u00e7erikleri a\u015fa\u011f\u0131daki gibi olsun.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class A\r\n    {\r\n        public string AdSoyad()\r\n        {\r\n            return &quot;Gen\u00e7ay Y\u0131ld\u0131z&quot;;\r\n        }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class B\r\n    {\r\n        public string Memleket()\r\n        {\r\n            return &quot;Artvin&quot;;\r\n        }\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class C\r\n    {\r\n\r\n    }\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi &#8220;A.cs&#8221; isimli s\u0131n\u0131f i\u00e7erisinde &#8220;AdSoyad&#8221; isimli bir metod, &#8220;B.cs&#8221; s\u0131n\u0131f i\u00e7erisinde ise &#8220;Memleket&#8221; isimli metodumuz bulunmaktad\u0131r.&#8221;C.cs&#8221; isimli s\u0131n\u0131f\u0131m\u0131zda ise bu iki metottan kal\u0131t\u0131m almaya \u00e7al\u0131\u015facak s\u0131n\u0131f\u0131m\u0131zd\u0131r.<br \/>\nHepimiz biliyoruz ki derleyici a\u015fa\u011f\u0131daki gibi bir kal\u0131t\u0131m tekni\u011fine m\u00fcsade etmeyecektir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n--- HATA ---\r\n    class C:A, B\r\n    {\r\n\r\n    }\r\n<\/pre>\n<p>Ben istiyorum ki, &#8220;C.cs&#8221; s\u0131n\u0131f\u0131 hem &#8220;A.cs&#8221; s\u0131n\u0131f\u0131ndan hem de &#8220;B.cs&#8221; s\u0131n\u0131f\u0131ndan kal\u0131t\u0131m als\u0131n ve ikisininde elemanlar\u0131n\u0131 kullans\u0131n.<br \/>\nBu i\u015flemi yapabilmek i\u00e7in, fonksiyonel olarak geni\u015fletilebilme \u00f6zelli\u011fine sahip &#8220;Extension Method&#8221; yap\u0131lar\u0131n\u0131 kullanaca\u011f\u0131z.&#8221;A.cs&#8221; ve &#8220;B.cs&#8221; s\u0131n\u0131flar\u0131nda kullanmak istedi\u011fimiz metodlar\u0131 interface yap\u0131lar\u0131na Extension metod olarak uygulayarak bu i\u015fin i\u00e7inden \u00e7\u0131kabiliriz.<\/p>\n<p>\u015eimdi &#8220;IA.cs&#8221; ve &#8220;IB.cs&#8221; isimli iki interface olu\u015fturuyorum.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    interface IA\r\n    {\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    interface IB\r\n    {\r\n    }\r\n<\/pre>\n<p>\u015eimdi de Extension metodlar\u0131m\u0131z\u0131 yazaca\u011f\u0131m\u0131z s\u0131n\u0131f\u0131m\u0131 olu\u015fturuyorum.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    static class Extension\r\n    {\r\n        public static string AdSoyad(this IA nesne)\r\n        {\r\n            return &quot;Gen\u00e7ay Y\u0131ld\u0131z&quot;;\r\n        }\r\n\r\n        public static string Memleket(this IB nesne)\r\n        {\r\n            return &quot;Artvin&quot;;\r\n        }\r\n    }\r\n<\/pre>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi &#8220;AdSoyad&#8221; ve &#8220;Memleket&#8221; isimli metodlar\u0131 kendi s\u0131n\u0131flar\u0131ndan \u00e7\u0131kar\u0131p &#8220;Extension&#8221;(sizler bu s\u0131n\u0131fa istedi\u011finiz gibi isim verebilirsiniz) isimli s\u0131n\u0131f\u0131mda Extension metod olarak uyguluyorum.Yukar\u0131da da bahsetti\u011fim gibi bu metodlar\u0131 kendi s\u0131n\u0131flar\u0131ndan \u00e7\u0131kard\u0131ktan sonra interface yap\u0131s\u0131na sahip Extension metod haline getirdim.Burada interface yap\u0131lar\u0131m\u0131z bizim olu\u015fturdu\u011fumuz &#8220;IA.cs&#8221; ve &#8220;IB.cs&#8221; isimli interface yap\u0131lar\u0131d\u0131r.<\/p>\n<p>Extension metod yap\u0131s\u0131 gere\u011fi hangi tipe \u00f6zelse o tipte ve o tipten kal\u0131t\u0131m alan s\u0131n\u0131f ve interfacelerde kullan\u0131lmaktad\u0131r.<\/p>\n<p>Hmmm madem bu \u00f6zelli\u011fi biliyoruz, ona g\u00f6re sanat\u0131m\u0131z\u0131 icra edebiliriz&#8230;<\/p>\n<p>\u015eimdi &#8220;C.cs&#8221; isimli s\u0131n\u0131f\u0131m\u0131 &#8220;IA.cs&#8221; ve &#8220;IB.cs&#8221; isimli s\u0131n\u0131flardan t\u00fcretirsem e\u011fer(ki IA.cs ve IB.cs art\u0131k bir interface oldu\u011fu i\u00e7in \u00e7okl\u0131 kal\u0131t\u0131m yapm\u0131\u015f oluyoruz) yukar\u0131da yazm\u0131\u015f oldu\u011fumuz Extension metodlar\u0131m\u0131zada &#8220;C.cs&#8221; isimli s\u0131n\u0131f\u0131m\u0131zdan ula\u015fabiliriz demektir.Yani dolayl\u0131 yoldan bir s\u0131n\u0131f\u0131 birden fazla s\u0131n\u0131ftan t\u00fcretme \u00f6zelli\u011fi g\u00f6stermi\u015f olaca\u011f\u0131z&#8230;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class C : IA, IB\r\n    {\r\n    }\r\n<\/pre>\n<p>\u015eimdi &#8220;C.cs&#8221; s\u0131n\u0131f\u0131m\u0131zdan bir \u00f6rnek al\u0131p \u00e7oklu kal\u0131t\u0131m olay\u0131n\u0131 yapabilmi\u015fmiyiz bakal\u0131m.<br \/>\n<a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2014\/08\/c-\u00e7oklu-kal\u0131t\u0131m-multiple-inheritance.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2014\/08\/c-\u00e7oklu-kal\u0131t\u0131m-multiple-inheritance.png\" alt=\"c# \u00e7oklu kal\u0131t\u0131m - multiple inheritance\" width=\"391\" height=\"215\" class=\"aligncenter size-full wp-image-2995\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2014\/08\/c-\u00e7oklu-kal\u0131t\u0131m-multiple-inheritance.png 391w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2014\/08\/c-\u00e7oklu-kal\u0131t\u0131m-multiple-inheritance-300x164.png 300w\" sizes=\"auto, (max-width: 391px) 100vw, 391px\" \/><\/a><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi &#8220;C.cs&#8221; s\u0131n\u0131f\u0131m\u0131z\u0131n nesnesinde metodlar\u0131m\u0131z g\u00f6z\u00fckmektedir.<\/p>\n<p>Bakal\u0131m \u00e7al\u0131\u015f\u0131yorlar m\u0131?<\/p>\n<p><a href=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2014\/08\/c-\u00e7oklu-kal\u0131t\u0131m-multiple-inheritance1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2014\/08\/c-\u00e7oklu-kal\u0131t\u0131m-multiple-inheritance1.png\" alt=\"c# \u00e7oklu kal\u0131t\u0131m - multiple inheritance\" width=\"574\" height=\"171\" class=\"aligncenter size-full wp-image-2996\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2014\/08\/c-\u00e7oklu-kal\u0131t\u0131m-multiple-inheritance1.png 574w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2014\/08\/c-\u00e7oklu-kal\u0131t\u0131m-multiple-inheritance1-300x89.png 300w\" sizes=\"auto, (max-width: 574px) 100vw, 574px\" \/><\/a><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi t\u00fcm yap\u0131lar sapa sa\u011flam \u00e7al\u0131\u015fmaktad\u0131r.<\/p>\n<p>Bu tekni\u011fin i\u00e7inde interface olmas\u0131, interface yap\u0131lar\u0131ndan \u00e7oklu kal\u0131t\u0131m alma olay\u0131yla kar\u0131\u015ft\u0131r\u0131lmamal\u0131d\u0131r.Bir s\u0131n\u0131f bir ve ya birden fazla interface&#8217;den kal\u0131t\u0131m al\u0131rken t\u00fcm elemanlar\u0131 implement etmek zorunda kal\u0131yoruz.Lakin bu teknikte interfaceler sayesinde elemanlar\u0131 implement etme sorumlulu\u011fu gibi derdimiz olmadan istedi\u011fimiz metodu s\u0131n\u0131f\u0131m\u0131za kal\u0131t\u0131m arac\u0131l\u0131\u011f\u0131yla kazand\u0131r\u0131yoruz.<\/p>\n<p>Burada dikkat etmeniz gereken husus sadece metodlarda bu tekni\u011fi kullanabiliyor olmam\u0131zd\u0131r.Property gibi elemanlar bu teknik d\u0131\u015f\u0131nda kalmaktad\u0131r.<\/p>\n<p>Bu fikri bizlere sunan ve bu yaz\u0131ya 4 y\u0131l \u00f6nceki makalesiyle destek vermi\u015f olan sevgili Burak Selim \u015eenyurt hocam\u0131za te\u015fekk\u00fcrlerimi sunar\u0131m&#8230;<br \/>\nAs\u0131l bilgi ve kaynak i\u00e7in : http:\/\/www.buraksenyurt.com\/post\/Diamond-Problem-C-ve-Multiple-Inheritance.aspx adresini ziyaret edebilirsiniz.<\/p>\n<p>\u0130yi \u00e7al\u0131\u015fmalar diliyorum&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek dile\u011fiyle&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Her C# yaz\u0131l\u0131mc\u0131s\u0131n\u0131n bildi\u011fi gibi &#8220;Inheritance&#8221; konusunda tek tip kal\u0131t\u0131m s\u00f6z konusudur.Yani bir s\u0131n\u0131f sadece ve sadece bir s\u0131n\u0131ftan t\u00fcreyebilir.Bu gelenek .NET mimarisinin \u00e7oklu kal\u0131t\u0131ma izin veren C++ dilindeki &#8220;Diamond Problem&#8221; isimli hatay\u0131 ibret&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,338],"tags":[673,27,674,672,157,508,671,676,675],"class_list":["post-2990","post","type-post","status-publish","format-standard","hentry","category-c-sharp-c","category-c-5-0","tag-base-class","tag-c","tag-derived-class","tag-diamond-problem","tag-inheritance","tag-multiple","tag-multiple-inheritance","tag-override","tag-virtual"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/2990","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=2990"}],"version-history":[{"count":1,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/2990\/revisions"}],"predecessor-version":[{"id":10387,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/2990\/revisions\/10387"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=2990"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=2990"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=2990"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}