﻿
{"id":25413,"date":"2022-08-09T18:34:36","date_gmt":"2022-08-09T18:34:36","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=25413"},"modified":"2022-08-09T18:34:36","modified_gmt":"2022-08-09T18:34:36","slug":"c-11-interfaceler-de-static-abstract-members-tanimlama-ozelligi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/c-11-interfaceler-de-static-abstract-members-tanimlama-ozelligi\/","title":{"rendered":"C# 11 &#8211; Interface&#8217;ler de Static Abstract Members Tan\u0131mlama \u00d6zelli\u011fi"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde C# 11 ile gelmesi beklenen ve static interface member&#8217;lar\u0131n\u0131n abstract olarak bildirilmesini sa\u011flayacak olan <em>Static Abstract Members In Interfaces<\/em> \u00f6zelli\u011fini de\u011ferlendiriyor olaca\u011f\u0131z.<\/p>\n<p>Her\u015feyden \u00f6nce temelden konuyu ele alal\u0131m ve static interface member&#8217;lar\u0131n\u0131n neler oldu\u011funu tekrardan hat\u0131rlayarak konuya girizg\u00e2h yapal\u0131m.<\/p>\n<h4>Static Interface Member&#8217;lar\u0131 Nelerdir?<\/h4>\n<p>Biliyorsunuz ki interface&#8217;ler;  class&#8217;lara klavuzluk eden bir ba\u015fka deyi\u015fle class&#8217;lar\u0131n imzalar\u0131n\u0131 temsil eden yap\u0131lar. Interface i\u00e7erisinde tan\u0131ml\u0131 olan t\u00fcm imzalar bu interface&#8217;leri uygulayan(implement eden) class&#8217;lar i\u00e7erisinde olu\u015fturulaca\u011f\u0131 taahh\u00fct\u00fc verilmekte ve b\u00f6ylece interface&#8217;ler arac\u0131l\u0131\u011f\u0131yla class&#8217;lara bir s\u00f6zle\u015fme misali davran\u0131\u015f sergilenmektedir.<\/p>\n<p>Basit olarak bir interface tan\u0131m\u0131 ve implementasyonu a\u015fa\u011f\u0131daki gibidir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ninterface IWorker\r\n{\r\n    void DoWork();\r\n}\r\n<\/pre>\n<\/div>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass Work : IWorker\r\n{\r\n    public void DoWork()\r\n    {\r\n        .\r\n        .\r\n        .\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p>Evet, zaten interface&#8217;ler hakk\u0131nda bu temel bilgileri bildi\u011finizi biliyorum. Static interface member&#8217;a gelirsek, hat\u0131rlarsan\u0131z e\u011fer C# 8.0&#8217;da <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-8-0-default-implementations-in-interfaces\/\" rel=\"noopener\" target=\"_blank\">Default Implementations In Interfaces<\/a> isimlendirmesi e\u015fli\u011finde interface&#8217;ler i\u00e7erisinde imzalar\u0131n g\u00f6vdelerini tan\u0131mlayabilece\u011fimiz bir \u00f6zellik gelmi\u015fti. \u0130\u015fte bu mevzu bahis \u00f6zelli\u011fin iki sat\u0131r \u00f6nce referans edilen makalesine g\u00f6z atarsan\u0131z e\u011fer interface i\u00e7erisinde default implemantasyon yap\u0131lan member&#8217;lar bir yandan da <code>static<\/code> olarak i\u015faretlenebilmekte ve b\u00f6ylece static bellek \u00fczerinden de bir eri\u015fim sa\u011flanabilmektedir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ninterface IWorker\r\n{\r\n    static void DoWork()\r\n    {\r\n        .\r\n        .\r\n        .\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p>Bak\u0131n\u0131z, interface i\u00e7erisinde bir eleman\u0131n static olabilmesi i\u00e7in default implementation olmas\u0131 gerekmektedir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/08\/C-11-Interfaceler-de-Static-Abstract-Members-Tanimlama-Ozelligi.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/08\/C-11-Interfaceler-de-Static-Abstract-Members-Tanimlama-Ozelligi.png\" alt=\"C# 11 - Interface&#039;ler de Static Abstract Members Tan\u0131mlama \u00d6zelli\u011fi\" width=\"306\" height=\"127\" class=\"alignleft size-full wp-image-25422\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/08\/C-11-Interfaceler-de-Static-Abstract-Members-Tanimlama-Ozelligi.png 306w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/08\/C-11-Interfaceler-de-Static-Abstract-Members-Tanimlama-Ozelligi-300x125.png 300w\" sizes=\"auto, (max-width: 306px) 100vw, 306px\" \/><\/a>Bu \u00f6nemli! Aksi taktirde yandaki g\u00f6rselde g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere interface i\u00e7erisindeki normal bir imzay\u0131 static yapmaya \u00e7al\u0131\u015f\u0131rsak e\u011fer compiler hata verecektir. Bu kullan\u0131m sade ve sadece default implementation durumu varsa s\u00f6z konusu olabilmektedir.<\/p>\n<p>\u015eimdi, C#&#8217;ta interface&#8217;ler ve default implementation hakk\u0131nda bilgilerimizi hasbel kader tazeledi\u011fimize g\u00f6re yava\u015ftan static abstract in interfaces \u00f6zelli\u011fini derinle\u015ftirmeye ba\u015flayabiliriz.<\/p>\n<h4>Static Abstract Members In Interfaces \u00d6zelli\u011fi Nedir?<\/h4>\n<p>Normal bir interface i\u00e7erisinde tan\u0131mlanm\u0131\u015f olan herhangi bir member imzas\u0131 \u00f6z\u00fc itibariyle dolayl\u0131 olarak <code>abstract<\/code>&#8216;t\u0131r. Benzer \u015fekilde yukar\u0131da bahsedildi\u011fi gibi default implementation s\u00f6z konusu ise bu member&#8217;da f\u0131trat\u0131 gere\u011fi <code>virtual<\/code> olarak yer edecektir.<\/p>\n<p>Bunu anlayabilmek i\u00e7in a\u015fa\u011f\u0131daki \u00f6rnek kod blo\u011funu bu a\u00e7\u0131klama \u00fczerinden ele al\u0131rsak e\u011fer;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ninterface IWorker\r\n{\r\n    void DoWork();\r\n    public void DoWork2()\r\n    {\r\n        .\r\n        .\r\n        .\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p>&#8216;DoWork&#8217; imzas\u0131 normal oldu\u011fu i\u00e7in \u00f6z\u00fc itibariyle <code>abstract<\/code> iken, &#8216;DoWork2&#8217; imzas\u0131 ise default implementation oldu\u011fu i\u00e7in <code>virtual<\/code> bir f\u0131trata sahiptir. Evet, C# programlama dili a\u00e7\u0131s\u0131ndan bu member&#8217;lar yap\u0131lar\u0131na g\u00f6re compiler a\u00e7\u0131s\u0131ndan bu \u015fekilde de\u011ferlendirilmektedirler. \u0130ste\u011fe ba\u011fl\u0131 bir \u015fekilde bu member&#8217;lara uygun keyword&#8217;leri de a\u015fa\u011f\u0131daki gibi fiziksel olarak yerle\u015ftirerek tan\u0131mlamalarda da bulunabilirsiniz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ninterface IWorker\r\n{\r\n    abstract void DoWork();\r\n    virtual public void DoWork2()\r\n    {\r\n        Console.WriteLine(&quot;&quot;);\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p>E\u011fer ki, default implementation olan member&#8217;lar\u0131n \u00f6z\u00fc itibariyle <code>virtual<\/code> olmalar\u0131n\u0131 istemiyorsan\u0131z direkt olarak a\u015fa\u011f\u0131daki gibi <code><a href=\"https:\/\/www.gencayyildiz.com\/blog\/cta-sealed-keywordu\/\" rel=\"noopener\" target=\"_blank\">sealed<\/a><\/code> keyword&#8217;\u00fc ile i\u015faretleyebilirsiniz. Ama bu i\u015flemin sadece default implementation olan member&#8217;lar i\u00e7in ge\u00e7erli oldu\u011funu unutmay\u0131n\u0131z. Normal bir imzay\u0131 ilgili keyword&#8217;le i\u015faretlemeniz compiler hatas\u0131 alman\u0131za sebebiyet verecektir.<\/p>\n<p>Normal \u015fartlarda static olarak i\u015faretlenmi\u015f default implementation member&#8217;lara gelirsek e\u011fer onlar \u00f6z\u00fc itibariyle ne <code>abstract<\/code>&#8216;t\u0131r ne <code>virtual<\/code>&#8216;d\u0131r ne de <code>sealed<\/code> ile i\u015faretlenebilir! Lakin C# 11 ile art\u0131k static interface member&#8217;lar\u0131 <code>abstract<\/code> keyword\u00fc ile i\u015faretlenebilmekte ve bu belirli bir davran\u0131\u015f sergilenmesine sebebiyet vermektedir. \u015eimdi gelin bu davran\u0131\u015f\u0131n ne oldu\u011funu ve nerelerde kullanabilece\u011fimiz inceleyelim&#8230;<\/p>\n<p>A\u015fa\u011f\u0131daki kod blo\u011funa g\u00f6z atarsan\u0131z static abstract member \u00f6rneklerini default implementation olan static member&#8217;lar ile birlikte g\u00f6receksiniz:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ninterface IX\r\n{\r\n    \/\/Static Abstract Member Method\r\n    static abstract void A();\r\n    \/\/Static Abstract Member Method\r\n    abstract static int B();\r\n    \/\/Static Abstract Member Property\r\n    static abstract int C { get; }\r\n    \/\/Static Abstract Member Property\r\n    static abstract int D { get; set; }\r\n\r\n    \/\/Static Member Method\r\n    static void E() { }\r\n    \/\/Static Member Property\r\n    static string F { get; }\r\n    \/\/Static Member Property\r\n    static string G { get { return &quot;&quot;; } }\r\n    \/\/Static Member Field\r\n    static string H;\r\n}\r\n<\/pre>\n<\/div>\n<p>Dikkat ederseniz &#8216;A&#8217;, &#8216;B&#8217;, &#8216;C&#8217; ve &#8216;D&#8217; imzalar\u0131 static abstract member olarak tan\u0131mlanm\u0131\u015fken, &#8216;E&#8217;, &#8216;F&#8217;, &#8216;G&#8217; ve &#8216;H&#8217; member&#8217;lar\u0131 ise static member olarak tan\u0131mlanm\u0131\u015ft\u0131r. Compiler, <code>abstract<\/code> keyword\u00fc ile i\u015faretlenmi\u015f t\u00fcm static member&#8217;lar\u0131n g\u00f6vdelerinin olu\u015fturulmas\u0131na izin vermezken, sadece static member&#8217;lar\u0131n metot oldu\u011fu s\u00fcrece g\u00f6vdelerini zorunlu k\u0131lmakta ve property ise opsiyonel b\u0131rakmaktad\u0131r. Biliyorum, bu kat\u0131 kurallar\u0131 akl\u0131m\u0131zda tutmak belki imkans\u0131za yak\u0131n bir durum olabilir ama nacizane olarak bilinmesinde fayda g\u00f6rmekteyim (ne yalan s\u00f6yleyim, yar\u0131m saat sonra bende unutabilirim) \ud83d\ude42 Ama \u015funu s\u00f6ylemek gerekmektedir ki, yukar\u0131daki \u00f6rnek kod blo\u011funda &#8216;A&#8217;, &#8216;B&#8217;, &#8216;C&#8217; ve &#8216;D&#8217; imzalar\u0131n\u0131n C# 11 versiyonu ile kullan\u0131labilmesi m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<p><em><strong>Peki hoca, nedir bunlar?<\/strong><\/em> dedi\u011finizi duyar gibiyim&#8230; Static abstract members \u00f6zelli\u011finin ne oldu\u011funu anlayabilmek i\u00e7in yukar\u0131daki \u00f6rnekteki t\u00fcm tan\u0131mlar\u0131 tek tek tetikleyerek yorumlamaya \u00e7al\u0131\u015f\u0131rsak e\u011fer;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/08\/C-11-Interfaceler-de-Static-Abstract-Members-Tanimlama-Ozelligi-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/08\/C-11-Interfaceler-de-Static-Abstract-Members-Tanimlama-Ozelligi-1.png\" alt=\"C# 11 - Interface&#039;ler de Static Abstract Members Tan\u0131mlama \u00d6zelli\u011fi\" width=\"163\" height=\"246\" class=\"alignleft size-full wp-image-25423\" \/><\/a><br \/>\nYandaki g\u00f6rselde g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere static member&#8217;lara interface referans\u0131 \u00fczerinden gayet rahat eri\u015febilirken, static abstract member&#8217;lara ise interface referans\u0131 \u00fczerinden eri\u015febilsek dahi compiler hata vermekte, demek ki farkl\u0131 bir kullan\u0131m beklemektedir.<\/p>\n<p>Burada compiler&#8217;\u0131n verdi\u011fi hataya g\u00f6z att\u0131\u011f\u0131m\u0131zda a\u015fa\u011f\u0131daki mesaj\u0131 g\u00f6rmekteyiz:<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/08\/C-11-Interfaceler-de-Static-Abstract-Members-Tanimlama-Ozelligi-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/08\/C-11-Interfaceler-de-Static-Abstract-Members-Tanimlama-Ozelligi-2.png\" alt=\"C# 11 - Interface&#039;ler de Static Abstract Members Tan\u0131mlama \u00d6zelli\u011fi\" width=\"505\" height=\"22\" class=\"aligncenter size-full wp-image-25424\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/08\/C-11-Interfaceler-de-Static-Abstract-Members-Tanimlama-Ozelligi-2.png 505w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/08\/C-11-Interfaceler-de-Static-Abstract-Members-Tanimlama-Ozelligi-2-300x13.png 300w\" sizes=\"auto, (max-width: 505px) 100vw, 505px\" \/><\/a>Mesaj\u0131n metinsel hali;<\/p>\n<div style=\"color:red;text-align:center;\">\n<strong><em>A static abstract interface member can be accessed only on a type parameter.<\/em><\/strong>\n<\/div>\n<p>Hata mesaj\u0131ndan anlad\u0131\u011f\u0131m\u0131z kadar\u0131yla static abstract member&#8217;lara yaln\u0131zca bir t\u00fcr parametresinden eri\u015febiliyormu\u015fuz. Yani bu iki anlama gelebilir. Birincisi, static abstract member&#8217;lar\u0131n bulundu\u011fu interface&#8217;i implemente eden bir s\u0131n\u0131f\u0131n t\u00fcr\u00fcnden bahsediyor olabilir ya da generic parametre t\u00fcrlerinden. \u00d6yle de\u011fil mi?<\/p>\n<p>\u015eimdi gelin ikisini de deneyip, g\u00f6zlemleyelim.<\/p>\n<p>\u0130lk olarak interface&#8217;i implemente eden s\u0131n\u0131f\u0131 inceleyelim.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass X : IX\r\n{\r\n    public static int C =&gt; 999;\r\n    static int _d;\r\n    public static int D { get =&gt; _d; set =&gt; _d = value; }\r\n    public static void A() =&gt; Console.WriteLine();\r\n    public static int B() =&gt; 999;\r\n}\r\n<\/pre>\n<\/div>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere i\u00e7erisinde static member&#8217;larla birlikte static abstract member&#8217;lar\u0131 bar\u0131nd\u0131ran &#8216;IX&#8217; interface&#8217;ini &#8216;X&#8217; class&#8217;\u0131na implement etti\u011fimizde sadece static abstract member&#8217;lar\u0131n g\u00f6vdeleri olu\u015fturulmu\u015ftur. \u00c7\u00fcnk\u00fc, yukar\u0131daki sat\u0131rlarda static abstract member&#8217;lar\u0131n g\u00f6vdeleri interface&#8217;de olu\u015fturulmaz demi\u015ftik. Haliyle interface&#8217;lerdeki static yap\u0131lar\u0131n imzalar\u0131 implement&#8217;e edilecek s\u0131n\u0131flarda fiziksel olarak olu\u015fturulsun istiyorsak <code>static abstract<\/code> ile i\u015faretlenmeleri gerekti\u011fini \u00f6\u011frenmi\u015f oluyoruz.<\/p>\n<p>Haliyle a\u015fa\u011f\u0131daki \u015fekilde bir kullan\u0131m neticesinde &#8216;X&#8217; referans\u0131 \u00fczerinden bu static member&#8217;lara rahatl\u0131kla eri\u015fim g\u00f6sterebiliyoruz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/08\/C-11-Interfaceler-de-Static-Abstract-Members-Tanimlama-Ozelligi-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/08\/C-11-Interfaceler-de-Static-Abstract-Members-Tanimlama-Ozelligi-3.png\" alt=\"C# 11 - Interface&#039;ler de Static Abstract Members Tan\u0131mlama \u00d6zelli\u011fi\" width=\"150\" height=\"113\" class=\"aligncenter size-full wp-image-25425\" \/><\/a>Evet, bildi\u011finiz class&#8217;lar \u00fczerinden static member talebinde bulunmu\u015f olduk. Ama netice itibariyle bir static member&#8217;\u0131 interface arac\u0131l\u0131\u011f\u0131yla herhangi bir s\u0131n\u0131fa zorunlu k\u0131lmak i\u00e7in static abstract keyword\u00fc e\u015fli\u011finde interface&#8217;de tan\u0131mlamam\u0131z gerekti\u011fini g\u00f6rm\u00fc\u015f olduk.<\/p>\n<p>\u015eimdi ise ikinci olarak, static abstract member&#8217;lar\u0131n daha elveri\u015fli bir \u015fekilde a\u011f\u0131rl\u0131kl\u0131 kullan\u0131m alan\u0131 olabilecek generic type parametrelerindeki davran\u0131\u015flar\u0131n\u0131 incelemeye ge\u00e7ebiliriz.<\/p>\n<p>Yukar\u0131da tan\u0131mlad\u0131\u011f\u0131m\u0131z interface&#8217;i a\u015fa\u011f\u0131daki gibi generic bir class&#8217;a base class constraint olarak tan\u0131mlayal\u0131m.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass X&lt;T&gt; where T : IX\r\n{\r\n\r\n}\r\n<\/pre>\n<\/div>\n<p>Mademki, static abstract member&#8217;lara yaln\u0131zca bir t\u00fcr parametresinden eri\u015febiliyoruz o halde bu generic &#8216;T&#8217; parametresi de bize ilgili memberlar\u0131 getirecektir anlam\u0131na geliyor.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass X&lt;T&gt; where T : IX\r\n{\r\n    public X()\r\n    {\r\n        T.A();\r\n        T.B();\r\n        var c = T.C;\r\n        var d = T.D;\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p>Ki \u00f6yle de olmaktad\u0131r. Nihayetinde &#8216;T&#8217; parametresi art\u0131k bir &#8216;IX&#8217; oldu\u011fundan dolay\u0131 ve &#8216;IX&#8217;de static abstract olarak tan\u0131mlanm\u0131\u015f olan member&#8217;larda oldu\u011fundan dolay\u0131 &#8216;T&#8217; \u00fczerinden ilgili member&#8217;lara eri\u015fim g\u00f6sterebilmekteyiz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/08\/C-11-Interfaceler-de-Static-Abstract-Members-Tanimlama-Ozelligi-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2022\/08\/C-11-Interfaceler-de-Static-Abstract-Members-Tanimlama-Ozelligi-4.png\" alt=\"C# 11 - Interface&#039;ler de Static Abstract Members Tan\u0131mlama \u00d6zelli\u011fi\" width=\"136\" height=\"171\" class=\"aligncenter size-full wp-image-25426\" \/><\/a>Ve dikkat ederseniz e\u011fer generic type &#8216;T&#8217; parametresinden static abstract member&#8217;lar\u0131n d\u0131\u015f\u0131nda static member&#8217;lara eri\u015fim g\u00f6sterilememektedir.<\/p>\n<p>Velhas\u0131l, yukar\u0131daki &#8216;X&lt;T&gt;&#8217; s\u0131n\u0131f\u0131n\u0131 kullan\u0131rken &#8216;T&#8217; parametresine verece\u011fimiz concrete s\u0131n\u0131f &#8216;IX&#8217;den t\u00fcreyece\u011fi i\u00e7in haliyle &#8216;IX&#8217; i\u00e7erisindeki static abstract member&#8217;lar\u0131 implement etmi\u015f bir s\u0131n\u0131f olaca\u011f\u0131ndan &#8216;T&#8217; \u00fczerinden \u00e7a\u011fr\u0131lan static member&#8217;lar bu s\u0131n\u0131ftakiler olacakt\u0131r.<\/p>\n<p>Misal olarak a\u015fa\u011f\u0131daki &#8216;Y&#8217; s\u0131n\u0131f\u0131n\u0131;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass Y : IX\r\n{\r\n    public static int C =&gt; 999;\r\n    static int _d;\r\n    public static int D { get =&gt; _d; set =&gt; _d = value; }\r\n    public static void A() =&gt; Console.WriteLine();\r\n    public static int B() =&gt; 999;\r\n}\r\n<\/pre>\n<\/div>\n<p>a\u015fa\u011f\u0131daki gibi &#8216;X&lt;T&gt;&#8217; generic s\u0131n\u0131f\u0131 ile kullan\u0131rsak;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nX&lt;Y&gt; x = new();\r\n<\/pre>\n<\/div>\n<p>&#8216;X&lt;T&gt;&#8217; s\u0131n\u0131f\u0131 i\u00e7erisinde constructor \u00fczerinden &#8216;T.A()&#8217;, &#8216;T.B()&#8217; vs. \u015feklinde tetiklenen member&#8217;lar &#8216;Y&#8217; s\u0131n\u0131f\u0131 \u00fczerindeki static member&#8217;lar olacakt\u0131r.<\/p>\n<blockquote><p><em><u>Genel K\u00fclt\u00fcr<\/u><br \/>\nAyr\u0131ca C# 11 ile static olarak i\u015faretlenmi\u015f member&#8217;lar\u0131n <code>sealed<\/code> keyword&#8217;\u00fc ile i\u015faretlenmesi de m\u00fcmk\u00fcnd\u00fcr.<br \/>\n<\/em><\/p><\/blockquote>\n<p><em><strong>Peki hoca, static abstract member&#8217;lara sahip olan bir interface&#8217;i explicit implementation nas\u0131l yapabiliriz?<\/strong><\/em><br \/>\nStatic abstract member&#8217;lar\u0131n explicit olarak implemente edilebilmeleri i\u00e7in ekstradan bir syntax belirlenmemi\u015ftir. Direkt olarak ilgili imzan\u0131n explicit tan\u0131mlamas\u0131na static keyword\u00fc e\u015fli\u011finde bildirimde bulunulmas\u0131 amaca hizmet edecektir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ninterface IX\r\n{\r\n    static abstract void X();\r\n    static abstract void Y();\r\n}\r\n<\/pre>\n<\/div>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass X : IX\r\n{\r\n    static void IX.X()\r\n    {\r\n        .\r\n        .\r\n        .\r\n    }\r\n\r\n    static void IX.Y()\r\n    {\r\n        .\r\n        .\r\n        .\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<h4>Static Abstract Operat\u00f6rlerin Generic Parametrelerdeki Rol\u00fc<\/h4>\n<p>Static abstract member&#8217;lar \u00f6zelli\u011fi sayesinde interface&#8217;ler de operat\u00f6r imzalar\u0131 tan\u0131mlayarak hedef class&#8217;lara zoraki olarak operator overloading i\u015flemi uygulanabilmektedir. Ayr\u0131ca bu operat\u00f6rler generic parametreler \u00fczerinden de faaliyet g\u00f6sterebilmektedirler.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ninterface IX\r\n{\r\n    int Value { get; }\r\n    static abstract int operator +(IX x);\r\n    static abstract int operator -(IX x);\r\n    static abstract int operator +(IX x, IX x2);\r\n    static abstract int operator -(IX x, IX x2);\r\n    static abstract long operator *(IX x, IX x2);\r\n    static abstract decimal operator \/(IX x, IX x2);\r\n    static abstract int operator +(IX x, A a);\r\n    static abstract int operator *(IX x, B b);\r\n}\r\nclass A { public int a; }\r\nclass B { public int b; }\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funa g\u00f6z atarsan\u0131z e\u011fer bir\u00e7ok operat\u00f6r imzas\u0131 implementasyon s\u00fcrecinde ilgili class&#8217;a zoraki uygulat\u0131lmak i\u00e7in tan\u0131mlanm\u0131\u015ft\u0131r. E\u011fer ki bu interface&#8217;i uygulamaya kalkarsan\u0131z a\u015fa\u011f\u0131daki gibi explicit olarak ger\u00e7ekle\u015ftirebilirsiniz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass X : IX\r\n{\r\n    public int Value =&gt; 5;\r\n    static int IX.operator +(IX x) =&gt; x.Value + 1;\r\n    static int IX.operator +(IX x, IX x2) =&gt; x.Value + x2.Value;\r\n    static int IX.operator +(IX x, A a) =&gt; x.Value + a.a;\r\n    static int IX.operator -(IX x) =&gt; x.Value - 1;\r\n    static int IX.operator -(IX x, IX x2) =&gt; x.Value - x2.Value;\r\n    static long IX.operator *(IX x, IX x2) =&gt; x.Value * x2.Value;\r\n    static int IX.operator *(IX x, B b) =&gt; x.Value * b.b;\r\n    static decimal IX.operator \/(IX x, IX x2) =&gt; x.Value \/ x2.Value;\r\n}\r\n<\/pre>\n<\/div>\n<p>Biz art\u0131k biliyoruz ki, static abstract olan bir member&#8217;a ancak ve ancak t\u00fcr tipi(referance type) \u00fczerinden (.)nokta diyerek eri\u015fim g\u00f6sterilebilmektedir. Halbuki bizler burada static abstract operat\u00f6r imzalar\u0131 tan\u0131mlam\u0131\u015f bulunuyoruz ve bu imzalar verilen t\u00fcrlerdeki nesneler kar\u015f\u0131l\u0131\u011f\u0131nda davran\u0131\u015f sergileyecek fonksiyonalitelere sahiptirler. Yani operat\u00f6rler nesne olmadan bir anlam ifade etmemektedirler. <strong><em>O halde bu tan\u0131mlaman\u0131n ne anlam\u0131 var hoca?<\/em><\/strong> diye muhtemel hakl\u0131 sorunuza kar\u015f\u0131l\u0131k konuyla ili\u015fkili ba\u015fl\u0131kta da belirtti\u011fim gibi generic parametreleri sunabilirim. Evet, static abstract olarak tan\u0131mlanan operat\u00f6rlerin implement edildikleri s\u0131n\u0131flar generic parametrelere base class olarak verildi\u011fi taktirde i\u015flevsellik kazanarak geli\u015ftiricilere etkili manevralar yapma olana\u011f\u0131 tan\u0131maktad\u0131rlar.<\/p>\n<p>\u015e\u00f6yle ki;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass Y&lt;T&gt; where T : IX, new()\r\n{\r\n    public Y()\r\n    {\r\n        T t1 = new();\r\n        T t2 = new();\r\n\r\n        var result1 = +t1;\r\n        var result2 = t1 + t2;\r\n        var result3 = t1 + new A();\r\n        var result4 = -t1 ;\r\n        var result5 = t1 - t2;\r\n        var result6 = t1 * t2;\r\n        var result7 = t1 * new B();\r\n        var result8 = t1 \/ t2;\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz generic &#8216;Y&#8217; isimli bir s\u0131n\u0131f olu\u015fturulmu\u015ftur ve &#8216;T&#8217; parametresine <a href=\"https:\/\/www.gencayyildiz.com\/blog\/cta-generic-new-constraint\/\" rel=\"noopener\" target=\"_blank\">new constraint<\/a> ile birlikte &#8216;IX&#8217; t\u00fcr\u00fcnden <a href=\"https:\/\/www.gencayyildiz.com\/blog\/cta-generic-base-class-constraint\/\" rel=\"noopener\" target=\"_blank\">base class constraint<\/a> uygulanm\u0131\u015ft\u0131r. Haliyle &#8216;T&#8217; bir yandan t\u00fcr\/type oldu\u011fu i\u00e7in art\u0131k &#8216;T&#8217; t\u00fcr\u00fcnden olan t\u00fcm instance&#8217;lar da &#8216;IX&#8217;de static abstract olarak tan\u0131mlanm\u0131\u015f operat\u00f6rler 8 ile 15. sat\u0131r aral\u0131\u011f\u0131nda oldu\u011fu gibi devreye girecektirler.<\/p>\n<p>Harika de\u011fil mi? \ud83d\ude42<\/p>\n<p><strong><em>Peki hoca! Bu operat\u00f6rler i\u015flevselliklerini nereden bilecekler?<\/em><\/strong> diye sorunuzu duyar gibiyim. El-cevap; &#8216;T&#8217; parametresine verilecek olan referans\u0131n, base class constraint sayesinde &#8216;IX&#8217;den t\u00fcreyen bir t\u00fcr olaca\u011f\u0131n\u0131n garantisi verilmektedir. B\u00f6ylece ilgili referans\u0131n i\u00e7erisine uygulanm\u0131\u015f operat\u00f6rlerin i\u015flevsellikleri buradaki \u00e7al\u0131\u015fmada ge\u00e7erli olacakt\u0131r. Dolay\u0131s\u0131yla bizler bu &#8216;T&#8217; parametresine yukar\u0131da olu\u015fturdu\u011fumuz ve &#8216;IX&#8217;i implement etti\u011fimiz &#8216;X&#8217; s\u0131n\u0131f\u0131n\u0131 verebiliriz. <\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nY&lt;X&gt; y = new();\r\n<\/pre>\n<\/div>\n<p>B\u00f6ylece &#8216;Y&#8217; s\u0131n\u0131f\u0131 olu\u015fturuldu\u011fu an \u00f6rnek ama\u00e7l\u0131 \u00e7al\u0131\u015fmalar\u0131n yap\u0131ld\u0131\u011f\u0131 constructor&#8217;\u0131nda &#8216;X&#8217; nesnesi \u00fczerinden operat\u00f6rler tetiklenecektir. Zaten bu y\u00fczden implementasyon s\u00fcrecinde &#8216;IX&#8217;den gelen operatorler explicit olarak &#8216;X&#8217;e uygulanmaktad\u0131r.<\/p>\n<p>Ayr\u0131ca unutmadan explicit veya implicit operator overloading ger\u00e7ekle\u015ftirmek ad\u0131na interface&#8217;de imza tan\u0131mlayabilmek i\u00e7in a\u015fa\u011f\u0131daki gibi davran\u0131\u015f sergileyebilirsiniz.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\ninterface IX&lt;T&gt; where T : IX&lt;T&gt;\r\n{\r\n    static abstract implicit operator string(T t);\r\n    static abstract implicit operator T(string s);\r\n    static abstract explicit operator int(T t);\r\n    static abstract explicit operator T(int i);\r\n    static abstract explicit operator A(T t);\r\n    static abstract explicit operator T(A a);\r\n}\r\nclass A { }\r\n<\/pre>\n<\/div>\n<p>Bu yap\u0131n\u0131n implementasyonu ise a\u015fa\u011f\u0131daki gibi olacakt\u0131r. <span style=\"font-size:10px;\">(Not : Visual Studio edit\u00f6r\u00fc explicit ve implicit operat\u00f6rlerin imzalar\u0131n\u0131 otomatik implement etmedi\u011fi i\u00e7in imzalara uygun operat\u00f6rleri manuel yazmak mecburiyetinde kalabilirsiniz. Ben kald\u0131m :))<\/span><\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass X : IX&lt;X&gt;\r\n{\r\n    static implicit IX&lt;X&gt;.operator string(X x) =&gt; &quot;&quot;;\r\n    static implicit IX&lt;X&gt;.operator X(string s) =&gt; new();\r\n    static explicit IX&lt;X&gt;.operator int(X x) =&gt; 0;\r\n    static explicit IX&lt;X&gt;.operator X(int i) =&gt; new();\r\n    static explicit IX&lt;X&gt;.operator A(X t) =&gt; new();\r\n    static explicit IX&lt;X&gt;.operator X(A a) =&gt; new();\r\n}\r\n<\/pre>\n<\/div>\n<p>Ve netice itibariyle bu yap\u0131y\u0131 kullanacak s\u0131n\u0131f\u0131 da a\u015fa\u011f\u0131daki gibi in\u015fa edip, ard\u0131ndan \u00f6rneklendirelim.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nclass Y&lt;T&gt; where T : IX&lt;T&gt;, new()\r\n{\r\n    public Y()\r\n    {\r\n        T t = new();\r\n\r\n        var result1 = (string)t;\r\n        var result2 = (T)&quot;&quot;;\r\n        var result3 = (int)t;\r\n        var result4 = (T)0;\r\n        var result5 = (A)t;\r\n        var result6 = (T)(new A());\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nY&lt;X&gt; y = new();\r\n<\/pre>\n<\/div>\n<p>\u0130\u015fte bu kadar \ud83d\ude42<\/p>\n<h4>Static Abstract Members \u00d6zelli\u011fi Genellikle Nerelerde Kullan\u0131l\u0131r?<\/h4>\n<p>Static Abstract Members \u00f6zelli\u011fi genellikle generic parametrelerdeki bilinmezlik durumu i\u00e7in gayet elveri\u015flidir diyebiliriz. Misal olarak, aritmetik i\u015flemler i\u00e7in <code style=\"color:red;\">System.Runtime.Experimental<\/code> namespace&#8217;i alt\u0131ndaki <code>INumber&lt;T&gt;<\/code> interface&#8217;ini inceleyebilirsiniz. <\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nstatic class Math\r\n{\r\n    static public void SumOrMultiplied&lt;T&gt;(T n1, T n2) where T : INumber&lt;T&gt;\r\n    {\r\n        var sumResult = (n1 + n2) + T.AdditiveIdentity;\r\n        var multiplyingResult = (n1 * n2) * T.MultiplicativeIdentity;\r\n    }\r\n}\r\n<\/pre>\n<\/div>\n<p>Bu interface sayesinde say\u0131sal de\u011ferlerin atanamad\u0131\u011f\u0131 &#8216;T&#8217; parametresi \u00fczerinden static abstract olarak tan\u0131mlanm\u0131\u015f imzalar sayesinde \u00e7arpma ve toplama gibi i\u015flemler i\u00e7in etkisiz elemanlara eri\u015febiliyoruz yahut aritmetik operat\u00f6rler e\u015fli\u011finde matematiksel i\u015flemleri generic boyuta ta\u015f\u0131yarak daha evrensel hareket edebiliyoruz.<\/p>\n<p>Yani anlayaca\u011f\u0131n\u0131z generic yap\u0131larda parametre \u00fczerinden static de\u011ferlere eri\u015fmemiz gereken her durum i\u00e7in static abstract \u00f6zelli\u011fi art\u0131k imdad\u0131m\u0131za yeti\u015fmektedir.<\/p>\n<p>\u015eimdi son olarak interface&#8217;ler de ki static abstract member&#8217;larla static member&#8217;lar aras\u0131ndaki fark\u0131 \u00f6zet mahiyetinde ayr\u0131\u015ft\u0131rarak i\u00e7eri\u011fimizi noktalayal\u0131m.<\/p>\n<table>\n<thead>\n<tr>\n<th width=\"50%\">Static Members<\/th>\n<th>Static Abstract Members<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Tan\u0131mland\u0131\u011f\u0131 interface&#8217;i uygulayan s\u0131n\u0131fa implement edilmesini zorunlu KILMAZ!<\/td>\n<td>Tan\u0131mland\u0131\u011f\u0131 interface&#8217;i uygulayan s\u0131n\u0131fa implement edilmesini zorunlu KILAR!<\/td>\n<\/tr>\n<tr>\n<td>Generic parametre \u00fczerinden ER\u0130\u015e\u0130LEMEZ!<\/td>\n<td>Generic parametre \u00fczerinden ER\u0130\u015e\u0130LEB\u0130L\u0130R!<\/td>\n<\/tr>\n<tr>\n<td>Interface \u00fczerinden static olarak ER\u0130\u015e\u0130LEB\u0130L\u0130R!<\/td>\n<td>Interface \u00fczerinden static olarak ER\u0130\u015e\u0130LEMEZ! <span style=\"font-size:10px;\">(Not : Interface referans\u0131 \u00fczerinde (.)nokta dedi\u011finizde static abstract member&#8217;\u0131n geldi\u011fini g\u00f6r\u00fcrs\u00fcn\u00fcz ama kullanamazs\u0131n\u0131z! Hata verir.)<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Nihai olarak \u015funu g\u00f6rebiliyoruz ki, art\u0131k generic yap\u0131lardaki parametreler, i\u00e7lerinde static abstract imzalar bar\u0131nd\u0131ran bir interface t\u00fcr\u00fcnden base class constraint&#8217;e sahip olduklar\u0131 taktirde, bu parametrelerin static member&#8217;lara eri\u015febilmesi, tetikleyebilmesi ve tan\u0131mlanm\u0131\u015f operat\u00f6rlere tabi tutulabilmesi <em>Static Abstract Members in Interfaces<\/em> \u00f6zelli\u011fi sayesinde m\u00fcmk\u00fcn hale gelmi\u015ftir. Kutlu olsun \ud83d\ude42<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<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>Merhaba, Bu i\u00e7eri\u011fimizde C# 11 ile gelmesi beklenen ve static interface member&#8217;lar\u0131n\u0131n abstract olarak bildirilmesini sa\u011flayacak olan Static Abstract Members In Interfaces \u00f6zelli\u011fini de\u011ferlendiriyor olaca\u011f\u0131z. Her\u015feyden \u00f6nce temelden konuyu ele alal\u0131m ve static interface&#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":25103,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,4580],"tags":[4581,4641,4642,4640,4638,4639],"class_list":["post-25413","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-c-sharp-c","category-c-11","tag-c-11","tag-c-11-static-abstract","tag-inumber","tag-static-abstract","tag-static-abstract-member","tag-static-abstract-member-in-interfaces"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/25413","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=25413"}],"version-history":[{"count":15,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/25413\/revisions"}],"predecessor-version":[{"id":25442,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/25413\/revisions\/25442"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/25103"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=25413"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=25413"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=25413"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}