{"id":1126,"date":"2011-02-01T16:27:20","date_gmt":"2011-02-01T15:27:20","guid":{"rendered":"http:\/\/soci.hu\/blog\/?p=1126"},"modified":"2015-07-01T17:45:44","modified_gmt":"2015-07-01T15:45:44","slug":"c-4-covariance","status":"publish","type":"post","link":"https:\/\/soci.hu\/blog\/index.php\/2011\/02\/01\/c-4-covariance\/","title":{"rendered":"C# 4 Covariance"},"content":{"rendered":"<p>.NET 4-es tanfolyamhoz \u00edrok egy prezent\u00e1ci\u00f3t. A co \u00e9s -contravarianci\u00e1t pr\u00f3b\u00e1lom \u00e9rhet\u0151v\u00e9 tenni. Kb. ez van a slideokon:<\/p>\n<p>Variance annotations \u2013 covariance 1.<\/p>\n<p>class Allat { }<br \/>\nclass Kutya : Allat { }<\/p>\n<p>interface IAllatGyar&lt;T&gt; where T : Allat<br \/>\n{<br \/>\n    T Create();<br \/>\n}<br \/>\nclass AllatGyar&lt;T&gt; : IAllatGyar&lt;T&gt; where T : Allat<br \/>\n{<br \/>\n    public T Create()<br \/>\n    {<br \/>\n        return default(T);<br \/>\n    }<br \/>\n}<br \/>\nAllatGyar&lt;Kutya&gt; kutyagyar = new AllatGyar&lt;Kutya&gt;();<br \/>\nIAllatGyar&lt;Allat&gt; allatGyar = kutyagyar; \/\/cast, jogos?<br \/>\nAllat a = allatGyar.Create(); \/\/mit ad vissza, t\u00edpusbiztos?<\/p>\n<p>Type ordering<br \/>\nKutya <: Allat - A Kutya az Allat oszt\u00e1ly lesz\u00e1mazottja\nk : Kutya - k a Kutya t\u00edpus egy p\u00e9ld\u00e1nya\nHa k : Kutya \u00e9s Kutya <: Allat, akkor k : Allat (Liskov f\u00e9le helyettes\u00edt\u00e9si elv)\nIgaz-e, hogy ha Kutya <: Allat, akkor IAllatgyar< Kutya > <: IAllatgyar< Allat > ?<br \/>\nEgy Kutya p\u00e9ld\u00e1ny implicit castolhat\u00f3 Allatt\u00e1. Az Allatgyar< Kutya > t\u00edpusbiztosan castolhat\u00f3-e Allatgyar< Allat >-t\u00e1?<br \/>\nHa csak kimeneti param\u00e9terk\u00e9nt vagy visszat\u00e9r\u00e9si \u00e9rt\u00e9kk\u00e9nt j\u00f6n ki T, akkor igen, mert Kutya <: Allat, \u00edgy minden kimeneti param\u00e9tern\u00e9l a Allat referenci\u00e1val biztons\u00e1gosan el\u00e9rhet\u0151 egy lesz\u00e1rmazott Kutya p\u00e9ld\u00e1ny is.\nHa igen, akkor T covariant, mert a t\u00edpusparam\u00e9terek type orderingje \u00e9rv\u00e9nyes a t\u00edpust haszn\u00e1l\u00f3 generikus t\u00edpusra is, ugyanabban a sorrendben (Kutya <: Allat  ==> IAllatgyar< Kutya > <: IAllatgyar< Allat >).<br \/>\nC# 4-ben az interf\u00e9sz met\u00f3dus vagy delegate szignat\u00far\u00e1ban az out kulcssz\u00f3 jelzi ezt:<\/p>\n<p>interface IAllatgyar&lt;out T&gt;.<\/p>\n<p>Amikor ez nem megy:<\/p>\n<p>class Allat { }<br \/>\nclass Kutya : Allat { }<\/p>\n<p>interface IAllatGyar&lt;T&gt; where T : Allat<br \/>\n{<br \/>\n    T Create();<br \/>\n    void Valami(T t); \/\/T befel\u00e9 megy!<br \/>\n}<\/p>\n<p>AllatGyar&lt;Kutya&gt; kutyagyar = new AllatGyar&lt;Kutya&gt;();<br \/>\nIAllatGyar&lt;Allat&gt; allatGyar = kutyagyar;<\/p>\n<p>kutyagyar.Valami(new Kutya()); \/\/Ez nyilv\u00e1n ok<\/p>\n<p>allatGyar.Valami(new Lo());    \/\/\u00c9s ez???<\/p>\n<p>Ha bemeneti param\u00e9ter is T, akkor az IAllatgyar< Allat > statikus t\u00edpuson, amely val\u00f3j\u00e1ban a IAllatgyar< Kutya > dinamikus t\u00edpusra mutat \u00e1tadhat\u00f3 lenne m\u00e1s \u00e1llat is, pl. L\u00f3, amely szint\u00e9n Allat lesz\u00e1rmazott, de az nyilv\u00e1nval\u00f3 runtime hib\u00e1t okozna. Ez\u00e9rt nem lehet covariant T, ha az interf\u00e9szen bemenetk\u00e9nt is szerepel T.<\/p>\n<p>\u00c9rhet\u0151 ez \u00edgy? B\u00e1rmilyen javaslatot sz\u00edvesen fogadok. A delegatekhez is \u00edrok persze anyagot, ez csak az eleje.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>.NET 4-es tanfolyamhoz \u00edrok egy prezent\u00e1ci\u00f3t. A co \u00e9s -contravarianci\u00e1t pr\u00f3b\u00e1lom \u00e9rhet\u0151v\u00e9 tenni. Kb. ez van a slideokon: Variance annotations \u2013 covariance&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8,75,10,4],"tags":[],"class_list":["post-1126","post","type-post","status-publish","format-standard","hentry","category-net","category-net-4","category-c","category-szakmai-elet"],"_links":{"self":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/1126","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=1126"}],"version-history":[{"count":5,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/1126\/revisions"}],"predecessor-version":[{"id":2079,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/posts\/1126\/revisions\/2079"}],"wp:attachment":[{"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=1126"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=1126"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/soci.hu\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=1126"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}