﻿
{"id":296,"date":"2012-03-21T00:50:10","date_gmt":"2012-03-21T00:50:10","guid":{"rendered":"http:\/\/www.gencayyildiz.com\/blog\/?p=296"},"modified":"2012-05-28T12:58:26","modified_gmt":"2012-05-28T12:58:26","slug":"cta-generic-base-class-constraint","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/cta-generic-base-class-constraint\/","title":{"rendered":"C# Generic Base Class Constraint"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Bu yaz\u0131mda C#&#8217;ta\u00a0Generic Base Class Constraint&#8217;ten bahsedece\u011fim.Generic Base Class Constraint ile Generic s\u0131n\u0131f\u0131m\u0131z\u0131n hangi veri t\u00fcrlerini kabul edece\u011fini k\u0131s\u0131tlayabiliriz.Generic s\u0131n\u0131flarda k\u0131s\u0131tlama yapabilmek i\u00e7in &#8220;&lt;T&gt; where T:Tip&#8221; imzas\u0131n\u0131 class imzas\u0131na eklemeliyiz.<br \/>\n<!--more--><br \/>\n\u015eimdi \u00f6rneklere ba\u015flamadan \u00f6nce A,B,C ve Gen ad\u0131nda d\u00f6rt adet s\u0131n\u0131f olu\u015ftural\u0131m.B s\u0131n\u0131f\u0131 A s\u0131n\u0131f\u0131ndan kal\u0131t\u0131m als\u0131n.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n---A.cs---\r\n    class A\r\n    {\r\n        public string MerhabaDunya()\r\n        {\r\n            return &quot;Merhaba D\u00fcnya&quot;;\r\n        }\r\n    }\r\n---B.cs---\r\n    class B:A\r\n    {\r\n        public string Merhaba()\r\n        {\r\n            return &quot;Merhaba&quot;;\r\n        }\r\n    }\r\n---C.cs---\r\n    class C\r\n    {\r\n\r\n    }\r\n<\/pre>\n<p>Yukar\u0131da g\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, A.cs s\u0131n\u0131f\u0131nda MerhabaDunya() metodu ve B.cs s\u0131n\u0131f\u0131nda Merhaba() metodu bulunmaktad\u0131r.<br \/>\n\u015eimdide Gen.cs ad\u0131nda Generic s\u0131n\u0131f\u0131m\u0131z\u0131 olu\u015ftural\u0131m.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Gen&lt;T&gt;\r\n    {\r\n\r\n    }\r\n<\/pre>\n<p>\u015eimdi yapmak istedi\u011fim senaryoyu a\u00e7\u0131kl\u0131yorum.Bu Gen.cs ad\u0131ndaki Generic s\u0131n\u0131f\u0131m\u0131zdan \u00fcretilen nesnelerde alaca\u011f\u0131 tipler, sadece A tipi olsun.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Gen&lt;T&gt; where T : A\r\n    {\r\n\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki Generic s\u0131n\u0131f art\u0131k A tipinden de\u011ferler almaktad\u0131r.Ba\u015fka tipten de\u011fer almayacakt\u0131r.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            Gen&lt;A&gt; gen1 = new Gen&lt;A&gt;(); \/\/Do\u011fru\r\n            Gen&lt;B&gt; gen2 = new Gen&lt;B&gt;(); \/\/Do\u011fru\r\n            Gen&lt;C&gt; gen3 = new Gen&lt;C&gt;(); \/\/Yanl\u0131\u015f\r\n<\/pre>\n<p>Yukar\u0131da sadece A tipinden de\u011fer alacak dedi\u011fim halde B tipinide kabul etmi\u015ftir.Ama C tipini kabul etmemi\u015ftir.Bunun sebebini azc\u0131k d\u00fc\u015f\u00fcn\u00fcp bulabiliriz.B s\u0131n\u0131f\u0131 A s\u0131n\u0131f\u0131ndan t\u00fcredi\u011fi i\u00e7in, \u00e7ok bi\u00e7imlilik sayesinde B tipide ge\u00e7erli oluyor.Sebebi budur.<\/p>\n<hr \/>\n<p>\u015eimdi a\u015fa\u011f\u0131daki Generic s\u0131n\u0131f\u0131n\u0131 tekrardan inceleyelim.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Gen&lt;T&gt; where T : A\r\n    {\r\n\r\n    }\r\n<\/pre>\n<p>Yukar\u0131larda bahsetti\u011fimiz gibi bu Generic s\u0131n\u0131f\u0131n tipi sadece A ve A dan t\u00fcreyen s\u0131n\u0131flar olabilir.<br \/>\n\u015eimdi sizlere bir\u015fey g\u00f6stermek istiyorum.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Gen&lt;T&gt; where T : A\r\n    {\r\n        T mesaj;\r\n        public void Mesaj()\r\n        {\r\n            mesaj.MerhabaDunya();\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu siz incelerken ben a\u015fa\u011f\u0131da ne anlatmak istedi\u011fimi a\u00e7\u0131klayay\u0131m.<br \/>\nBu Generic s\u0131n\u0131f\u0131n alaca\u011f\u0131 parametresine gelecek olan tipin A tipinden ve A dan t\u00fcreyen bir tipten oldu\u011funu biliyoruz.Kesin eminiz.Yani yukar\u0131daki yap\u0131da &#8220;T&#8221; kesinlikle A d\u0131r(A tipidir.).T tipinden(yani A tipinden) &#8220;mesaj&#8221; ad\u0131nda bir field olu\u015fturuluyor.Mesaj() metodu i\u00e7inde bu field\u0131 yaz\u0131p nokta dedi\u011fimizde A s\u0131n\u0131f\u0131 i\u00e7indeki MerhabaDunya() metodunu g\u00f6r\u00fcyoruz.Bunun sebebi,derleyicininde bundan emin olmas\u0131d\u0131r.Yukar\u0131daki Constraint(k\u0131s\u0131tlay\u0131c\u0131) bize, T nin A oldu\u011funu s\u00f6yl\u00fcyor.Ee haliyle derleyicide &#8220;madem ben bunun A oldu\u011funu biliyorum, hi\u00e7 uzatmay\u0131m T tipinden bir referansa A&#8217;n\u0131n elemanlar\u0131n\u0131 at\u0131y\u0131m&#8221; diyor.\u00c7\u00fcnk\u00fc T tipinden de\u011fi\u015fken dedi\u011fimiz A tipinden bir de\u011fi\u015fkendir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    class Gen&lt;T&gt; where T : B\r\n    {\r\n        T mesaj;\r\n        public void Mesaj()\r\n        {\r\n            mesaj.MerhabaDunya();\r\n            mesaj.Merhaba();\r\n        }\r\n    }\r\n<\/pre>\n<p>E\u011fer yukar\u0131daki s\u0131n\u0131f\u0131 incelerseniz, bu seferde T nin sadece B tipinden olaca\u011f\u0131n\u0131 s\u00f6yl\u00fcyoruz.Ve T tipinden(asl\u0131nda B tipinden) olan mesaj referans\u0131na nokta dedi\u011fimizde, B.cs s\u0131n\u0131f\u0131ndaki Merhaba() metoduyla kar\u015f\u0131la\u015f\u0131yoruz.Ve ayriyetten A.cs s\u0131n\u0131f\u0131ndaki MerhabaDunya() s\u0131n\u0131f\u0131n\u0131da g\u00f6r\u00fcyoruz.Bunun sebebi nedir? diye sorarsan\u0131z e\u011fer,konumuzun ek bir teferruat\u0131 de\u011fildir.Sadece programlamada Kal\u0131t\u0131m konusunu biliyorsan\u0131z ne demek istedi\u011fimi anlayacaks\u0131n\u0131z.B s\u0131n\u0131f\u0131 A s\u0131n\u0131f\u0131ndan kal\u0131t\u0131m ald\u0131\u011f\u0131 i\u00e7in,B s\u0131n\u0131f\u0131 nesnesi veya referans\u0131 \u00fczerinden, hem kendi elemanlar\u0131n\u0131 hemde kal\u0131t\u0131m ald\u0131\u011f\u0131 s\u0131n\u0131f\u0131n(base class) elemanlar\u0131na ula\u015f\u0131l\u0131r.<\/p>\n<p>Bu yaz\u0131m\u0131nda sonuna gelmi\u015f olduk.Umar\u0131m ne demek istedi\u011fimi anlam\u0131\u015fs\u0131n\u0131zd\u0131r \ud83d\ude42<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#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>Bu yaz\u0131mda C#&#8217;ta\u00a0Generic Base Class Constraint&#8217;ten bahsedece\u011fim.Generic Base Class Constraint ile Generic s\u0131n\u0131f\u0131m\u0131z\u0131n hangi veri t\u00fcrlerini kabul edece\u011fini k\u0131s\u0131tlayabiliriz.Generic s\u0131n\u0131flarda k\u0131s\u0131tlama yapabilmek i\u00e7in &#8220;&lt;T&gt; where T:Tip&#8221; imzas\u0131n\u0131 class imzas\u0131na eklemeliyiz.<!-- 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],"tags":[176,68,110,145],"class_list":["post-296","post","type-post","status-publish","format-standard","hentry","category-c-sharp-c","tag-base","tag-class","tag-constraint","tag-generic"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/296","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=296"}],"version-history":[{"count":0,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/296\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=296"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=296"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=296"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}