[{"data":1,"prerenderedAt":1167},["ShallowReactive",2],{"page-\u002Fcsharp\u002Fheritage-et-interfaces":3,"pieces-csharp":1124,"autour-\u002Fcsharp\u002Fheritage-et-interfaces":1149,"prerequis-\u002Fcsharp\u002Fheritage-et-interfaces":1154,"plan-csharp":1156},{"id":4,"title":5,"body":6,"description":1090,"extension":1091,"ligne":60,"meta":1092,"motsCles":1093,"navigation":113,"niveau":1097,"path":1098,"prerequis":1099,"ressources":1101,"seo":1113,"sources":1114,"stem":1122,"__hash__":1123},"docs\u002Fcsharp\u002F05.heritage-et-interfaces.md","Héritage et interfaces",{"type":7,"value":8,"toc":1080},"minimark",[9,14,32,36,45,55,262,279,289,293,304,437,440,534,554,558,565,610,613,619,623,630,712,725,729,739,857,871,874,964,968,1024,1030,1034,1076],[10,11,13],"h2",{"id":12},"ce-que-tu-vas-apprendre","Ce que tu vas apprendre",[15,16,17,21,29],"ul",{},[18,19,20],"li",{},"Créer une classe qui hérite d'une autre et redéfinir une méthode.",[18,22,23,24,28],{},"Faire appel au comportement de la classe de base avec ",[25,26,27],"code",{},"base",".",[18,30,31],{},"Décrire un contrat avec une interface et l'implémenter dans plusieurs classes.",[10,33,35],{"id":34},"lidée-de-lhéritage","L'idée de l'héritage",[37,38,39,40,44],"p",{},"Sur ton site de recettes, un dessert et un plat ont des points communs : un nom, un temps de préparation. Plutôt que de tout écrire deux fois, une classe peut ",[41,42,43],"strong",{},"hériter"," d'une autre. Elle reçoit alors ses membres et peut en ajouter.",[37,46,47,48,51,52,28],{},"La classe d'origine s'appelle la ",[41,49,50],{},"classe de base",". La classe qui hérite s'appelle la ",[41,53,54],{},"classe dérivée",[56,57,62],"pre",{"className":58,"code":59,"language":60,"meta":61,"style":61},"language-csharp shiki shiki-themes github-light-default github-dark-default github-dark-default","public class Recette\n{\n    public string Nom { get; }\n\n    public Recette(string nom)\n    {\n        Nom = nom;\n    }\n\n    public virtual string Decrire() => $\"Recette : {Nom}\";\n}\n\npublic class Dessert : Recette\n{\n    public Dessert(string nom) : base(nom) { }\n}\n","csharp","",[25,63,64,80,87,108,115,136,142,154,160,165,203,209,214,230,235,257],{"__ignoreMap":61},[65,66,69,73,76],"span",{"class":67,"line":68},"line",1,[65,70,72],{"class":71},"sOnC1","public",[65,74,75],{"class":71}," class",[65,77,79],{"class":78},"sIXEE"," Recette\n",[65,81,83],{"class":67,"line":82},2,[65,84,86],{"class":85},"scfrF","{\n",[65,88,90,93,96,99,102,105],{"class":67,"line":89},3,[65,91,92],{"class":71},"    public",[65,94,95],{"class":71}," string",[65,97,98],{"class":78}," Nom",[65,100,101],{"class":85}," { ",[65,103,104],{"class":71},"get",[65,106,107],{"class":85},"; }\n",[65,109,111],{"class":67,"line":110},4,[65,112,114],{"emptyLinePlaceholder":113},true,"\n",[65,116,118,120,124,127,130,133],{"class":67,"line":117},5,[65,119,92],{"class":71},[65,121,123],{"class":122},"syCW7"," Recette",[65,125,126],{"class":85},"(",[65,128,129],{"class":71},"string",[65,131,132],{"class":78}," nom",[65,134,135],{"class":85},")\n",[65,137,139],{"class":67,"line":138},6,[65,140,141],{"class":85},"    {\n",[65,143,145,148,151],{"class":67,"line":144},7,[65,146,147],{"class":85},"        Nom ",[65,149,150],{"class":71},"=",[65,152,153],{"class":85}," nom;\n",[65,155,157],{"class":67,"line":156},8,[65,158,159],{"class":85},"    }\n",[65,161,163],{"class":67,"line":162},9,[65,164,114],{"emptyLinePlaceholder":113},[65,166,168,170,173,175,178,181,184,188,191,194,197,200],{"class":67,"line":167},10,[65,169,92],{"class":71},[65,171,172],{"class":71}," virtual",[65,174,95],{"class":71},[65,176,177],{"class":122}," Decrire",[65,179,180],{"class":85},"() ",[65,182,183],{"class":71},"=>",[65,185,187],{"class":186},"shWOn"," $\"Recette : ",[65,189,190],{"class":186},"{",[65,192,193],{"class":85},"Nom",[65,195,196],{"class":186},"}",[65,198,199],{"class":186},"\"",[65,201,202],{"class":85},";\n",[65,204,206],{"class":67,"line":205},11,[65,207,208],{"class":85},"}\n",[65,210,212],{"class":67,"line":211},12,[65,213,114],{"emptyLinePlaceholder":113},[65,215,217,219,221,224,227],{"class":67,"line":216},13,[65,218,72],{"class":71},[65,220,75],{"class":71},[65,222,223],{"class":78}," Dessert",[65,225,226],{"class":85}," : ",[65,228,229],{"class":78},"Recette\n",[65,231,233],{"class":67,"line":232},14,[65,234,86],{"class":85},[65,236,238,240,242,244,246,248,251,254],{"class":67,"line":237},15,[65,239,92],{"class":71},[65,241,223],{"class":122},[65,243,126],{"class":85},[65,245,129],{"class":71},[65,247,132],{"class":78},[65,249,250],{"class":85},") : ",[65,252,27],{"class":253},"s5iOY",[65,255,256],{"class":85},"(nom) { }\n",[65,258,260],{"class":67,"line":259},16,[65,261,208],{"class":85},[37,263,264,267,268,271,272,274,275,278],{},[25,265,266],{},"Dessert : Recette"," se lit « Dessert hérite de Recette ». Un ",[25,269,270],{},"Dessert"," possède la propriété ",[25,273,193],{}," et la méthode ",[25,276,277],{},"Decrire"," sans les réécrire.",[37,280,281,282,284,285,288],{},"Le constructeur de ",[25,283,270],{}," appelle ",[25,286,287],{},": base(nom)"," pour passer le nom au constructeur de la classe de base.",[10,290,292],{"id":291},"redéfinir-avec-virtual-et-override","Redéfinir avec virtual et override",[37,294,295,296,299,300,303],{},"Un dessert veut se décrire autrement. La classe de base marque la méthode ",[25,297,298],{},"virtual"," (elle peut être redéfinie), et la classe dérivée utilise ",[25,301,302],{},"override"," :",[56,305,307],{"className":58,"code":306,"language":60,"meta":61,"style":61},"public class Dessert : Recette\n{\n    public int Sucre { get; }\n\n    public Dessert(string nom, int sucre) : base(nom)\n    {\n        Sucre = sucre;\n    }\n\n    public override string Decrire() => $\"Dessert : {Nom}, {Sucre} g de sucre\";\n}\n",[25,308,309,321,325,341,345,373,377,387,391,395,433],{"__ignoreMap":61},[65,310,311,313,315,317,319],{"class":67,"line":68},[65,312,72],{"class":71},[65,314,75],{"class":71},[65,316,223],{"class":78},[65,318,226],{"class":85},[65,320,229],{"class":78},[65,322,323],{"class":67,"line":82},[65,324,86],{"class":85},[65,326,327,329,332,335,337,339],{"class":67,"line":89},[65,328,92],{"class":71},[65,330,331],{"class":71}," int",[65,333,334],{"class":78}," Sucre",[65,336,101],{"class":85},[65,338,104],{"class":71},[65,340,107],{"class":85},[65,342,343],{"class":67,"line":110},[65,344,114],{"emptyLinePlaceholder":113},[65,346,347,349,351,353,355,357,360,363,366,368,370],{"class":67,"line":117},[65,348,92],{"class":71},[65,350,223],{"class":122},[65,352,126],{"class":85},[65,354,129],{"class":71},[65,356,132],{"class":78},[65,358,359],{"class":85},", ",[65,361,362],{"class":71},"int",[65,364,365],{"class":78}," sucre",[65,367,250],{"class":85},[65,369,27],{"class":253},[65,371,372],{"class":85},"(nom)\n",[65,374,375],{"class":67,"line":138},[65,376,141],{"class":85},[65,378,379,382,384],{"class":67,"line":144},[65,380,381],{"class":85},"        Sucre ",[65,383,150],{"class":71},[65,385,386],{"class":85}," sucre;\n",[65,388,389],{"class":67,"line":156},[65,390,159],{"class":85},[65,392,393],{"class":67,"line":162},[65,394,114],{"emptyLinePlaceholder":113},[65,396,397,399,402,404,406,408,410,413,415,417,419,421,423,426,428,431],{"class":67,"line":167},[65,398,92],{"class":71},[65,400,401],{"class":71}," override",[65,403,95],{"class":71},[65,405,177],{"class":122},[65,407,180],{"class":85},[65,409,183],{"class":71},[65,411,412],{"class":186}," $\"Dessert : ",[65,414,190],{"class":186},[65,416,193],{"class":85},[65,418,196],{"class":186},[65,420,359],{"class":186},[65,422,190],{"class":186},[65,424,425],{"class":85},"Sucre",[65,427,196],{"class":186},[65,429,430],{"class":186}," g de sucre\"",[65,432,202],{"class":85},[65,434,435],{"class":67,"line":205},[65,436,208],{"class":85},[37,438,439],{},"Le résultat dépend du type réel de l'objet :",[56,441,443],{"className":58,"code":442,"language":60,"meta":61,"style":61},"Recette r = new Recette(\"Soupe\");\nRecette d = new Dessert(\"Tarte\", 80);\n\nConsole.WriteLine(r.Decrire());   \u002F\u002F Recette : Soupe\nConsole.WriteLine(d.Decrire());   \u002F\u002F Dessert : Tarte, 80 g de sucre\n",[25,444,445,469,494,498,518],{"__ignoreMap":61},[65,446,447,450,453,456,459,461,463,466],{"class":67,"line":68},[65,448,449],{"class":78},"Recette",[65,451,452],{"class":78}," r",[65,454,455],{"class":71}," =",[65,457,458],{"class":71}," new",[65,460,123],{"class":78},[65,462,126],{"class":85},[65,464,465],{"class":186},"\"Soupe\"",[65,467,468],{"class":85},");\n",[65,470,471,473,476,478,480,482,484,487,489,492],{"class":67,"line":82},[65,472,449],{"class":78},[65,474,475],{"class":78}," d",[65,477,455],{"class":71},[65,479,458],{"class":71},[65,481,223],{"class":78},[65,483,126],{"class":85},[65,485,486],{"class":186},"\"Tarte\"",[65,488,359],{"class":85},[65,490,491],{"class":253},"80",[65,493,468],{"class":85},[65,495,496],{"class":67,"line":89},[65,497,114],{"emptyLinePlaceholder":113},[65,499,500,503,506,509,511,514],{"class":67,"line":110},[65,501,502],{"class":85},"Console.",[65,504,505],{"class":122},"WriteLine",[65,507,508],{"class":85},"(r.",[65,510,277],{"class":122},[65,512,513],{"class":85},"());   ",[65,515,517],{"class":516},"sd6ml","\u002F\u002F Recette : Soupe\n",[65,519,520,522,524,527,529,531],{"class":67,"line":117},[65,521,502],{"class":85},[65,523,505],{"class":122},[65,525,526],{"class":85},"(d.",[65,528,277],{"class":122},[65,530,513],{"class":85},[65,532,533],{"class":516},"\u002F\u002F Dessert : Tarte, 80 g de sucre\n",[37,535,536,537,540,541,543,544,546,547,549,550,553],{},"La variable ",[25,538,539],{},"d"," a le type ",[25,542,449],{},", mais l'objet est un ",[25,545,270],{},". C'est la version du ",[25,548,270],{}," qui s'exécute. On appelle cela le ",[41,551,552],{},"polymorphisme"," : un même appel, des comportements différents selon l'objet.",[10,555,557],{"id":556},"réutiliser-le-parent-avec-base","Réutiliser le parent avec base",[37,559,560,561,564],{},"Dans une méthode redéfinie, ",[25,562,563],{},"base.Methode()"," appelle la version de la classe de base :",[56,566,568],{"className":58,"code":567,"language":60,"meta":61,"style":61},"public override string Decrire() => base.Decrire() + $\" (dessert, {Sucre} g de sucre)\";\n",[25,569,570],{"__ignoreMap":61},[65,571,572,574,576,578,580,582,584,587,589,591,593,596,599,601,603,605,608],{"class":67,"line":68},[65,573,72],{"class":71},[65,575,401],{"class":71},[65,577,95],{"class":71},[65,579,177],{"class":122},[65,581,180],{"class":85},[65,583,183],{"class":71},[65,585,586],{"class":253}," base",[65,588,28],{"class":85},[65,590,277],{"class":122},[65,592,180],{"class":85},[65,594,595],{"class":71},"+",[65,597,598],{"class":186}," $\" (dessert, ",[65,600,190],{"class":186},[65,602,425],{"class":85},[65,604,196],{"class":186},[65,606,607],{"class":186}," g de sucre)\"",[65,609,202],{"class":85},[37,611,612],{},"Tu complètes ainsi le comportement au lieu de le remplacer.",[614,615,616],"note",{},[37,617,618],{},"Une classe ne peut hériter que d'une seule classe de base. Pour partager un comportement entre des classes sans lien de parenté, on utilise les interfaces, vues plus bas.",[10,620,622],{"id":621},"classe-abstraite","Classe abstraite",[37,624,625,626,629],{},"Parfois, la classe de base n'a pas de sens seule : une « recette » générique n'existe pas dans la cuisine. Marque-la ",[25,627,628],{},"abstract"," pour interdire de la créer directement :",[56,631,633],{"className":58,"code":632,"language":60,"meta":61,"style":61},"public abstract class Recette\n{\n    public abstract int Minutes();\n}\n\npublic class Crepes : Recette\n{\n    public override int Minutes() => 30;\n}\n",[25,634,635,646,650,664,668,672,685,689,708],{"__ignoreMap":61},[65,636,637,639,642,644],{"class":67,"line":68},[65,638,72],{"class":71},[65,640,641],{"class":71}," abstract",[65,643,75],{"class":71},[65,645,79],{"class":78},[65,647,648],{"class":67,"line":82},[65,649,86],{"class":85},[65,651,652,654,656,658,661],{"class":67,"line":89},[65,653,92],{"class":71},[65,655,641],{"class":71},[65,657,331],{"class":71},[65,659,660],{"class":122}," Minutes",[65,662,663],{"class":85},"();\n",[65,665,666],{"class":67,"line":110},[65,667,208],{"class":85},[65,669,670],{"class":67,"line":117},[65,671,114],{"emptyLinePlaceholder":113},[65,673,674,676,678,681,683],{"class":67,"line":138},[65,675,72],{"class":71},[65,677,75],{"class":71},[65,679,680],{"class":78}," Crepes",[65,682,226],{"class":85},[65,684,229],{"class":78},[65,686,687],{"class":67,"line":144},[65,688,86],{"class":85},[65,690,691,693,695,697,699,701,703,706],{"class":67,"line":156},[65,692,92],{"class":71},[65,694,401],{"class":71},[65,696,331],{"class":71},[65,698,660],{"class":122},[65,700,180],{"class":85},[65,702,183],{"class":71},[65,704,705],{"class":253}," 30",[65,707,202],{"class":85},[65,709,710],{"class":67,"line":162},[65,711,208],{"class":85},[37,713,714,715,717,718,720,721,724],{},"Une méthode ",[25,716,628],{}," n'a pas de corps. Chaque classe dérivée doit l'écrire avec ",[25,719,302],{},". Le mot-clé ",[25,722,723],{},"sealed"," fait l'inverse : il interdit à une classe d'être héritée.",[10,726,728],{"id":727},"les-interfaces","Les interfaces",[37,730,731,732,735,736,28],{},"Une ",[41,733,734],{},"interface"," est un contrat : elle liste des membres qu'une classe doit fournir, sans écrire leur code. Par convention, son nom commence par un ",[25,737,738],{},"I",[56,740,742],{"className":58,"code":741,"language":60,"meta":61,"style":61},"public interface IPrix\n{\n    double CalculerPrix();\n}\n\npublic class Crepes : IPrix\n{\n    public double CalculerPrix() => 3.5;\n}\n\npublic class Menu : IPrix\n{\n    public double CalculerPrix() => 12.0;\n}\n",[25,743,744,754,758,768,772,776,789,793,811,815,819,832,836,853],{"__ignoreMap":61},[65,745,746,748,751],{"class":67,"line":68},[65,747,72],{"class":71},[65,749,750],{"class":71}," interface",[65,752,753],{"class":78}," IPrix\n",[65,755,756],{"class":67,"line":82},[65,757,86],{"class":85},[65,759,760,763,766],{"class":67,"line":89},[65,761,762],{"class":71},"    double",[65,764,765],{"class":122}," CalculerPrix",[65,767,663],{"class":85},[65,769,770],{"class":67,"line":110},[65,771,208],{"class":85},[65,773,774],{"class":67,"line":117},[65,775,114],{"emptyLinePlaceholder":113},[65,777,778,780,782,784,786],{"class":67,"line":138},[65,779,72],{"class":71},[65,781,75],{"class":71},[65,783,680],{"class":78},[65,785,226],{"class":85},[65,787,788],{"class":78},"IPrix\n",[65,790,791],{"class":67,"line":144},[65,792,86],{"class":85},[65,794,795,797,800,802,804,806,809],{"class":67,"line":156},[65,796,92],{"class":71},[65,798,799],{"class":71}," double",[65,801,765],{"class":122},[65,803,180],{"class":85},[65,805,183],{"class":71},[65,807,808],{"class":253}," 3.5",[65,810,202],{"class":85},[65,812,813],{"class":67,"line":162},[65,814,208],{"class":85},[65,816,817],{"class":67,"line":167},[65,818,114],{"emptyLinePlaceholder":113},[65,820,821,823,825,828,830],{"class":67,"line":205},[65,822,72],{"class":71},[65,824,75],{"class":71},[65,826,827],{"class":78}," Menu",[65,829,226],{"class":85},[65,831,788],{"class":78},[65,833,834],{"class":67,"line":211},[65,835,86],{"class":85},[65,837,838,840,842,844,846,848,851],{"class":67,"line":216},[65,839,92],{"class":71},[65,841,799],{"class":71},[65,843,765],{"class":122},[65,845,180],{"class":85},[65,847,183],{"class":71},[65,849,850],{"class":253}," 12.0",[65,852,202],{"class":85},[65,854,855],{"class":67,"line":232},[65,856,208],{"class":85},[37,858,859,862,863,866,867,870],{},[25,860,861],{},"Crepes : IPrix"," signifie que ",[25,864,865],{},"Crepes"," promet de fournir ",[25,868,869],{},"CalculerPrix",". Si elle l'oublie, le compilateur refuse le programme.",[37,872,873],{},"Une classe peut implémenter plusieurs interfaces, en les séparant par des virgules. Ces deux classes n'ont aucun lien d'héritage, mais on peut les traiter ensemble :",[56,875,877],{"className":58,"code":876,"language":60,"meta":61,"style":61},"var elements = new List\u003CIPrix> { new Crepes(), new Menu() };\n\nforeach (IPrix element in elements)\n{\n    Console.WriteLine(element.CalculerPrix());\n}\n",[25,878,879,918,922,941,945,960],{"__ignoreMap":61},[65,880,881,884,887,889,891,894,897,900,903,906,908,911,913,915],{"class":67,"line":68},[65,882,883],{"class":71},"var",[65,885,886],{"class":78}," elements",[65,888,455],{"class":71},[65,890,458],{"class":71},[65,892,893],{"class":78}," List",[65,895,896],{"class":85},"\u003C",[65,898,899],{"class":78},"IPrix",[65,901,902],{"class":85},"> { ",[65,904,905],{"class":71},"new",[65,907,680],{"class":78},[65,909,910],{"class":85},"(), ",[65,912,905],{"class":71},[65,914,827],{"class":78},[65,916,917],{"class":85},"() };\n",[65,919,920],{"class":67,"line":82},[65,921,114],{"emptyLinePlaceholder":113},[65,923,924,927,930,932,935,938],{"class":67,"line":89},[65,925,926],{"class":71},"foreach",[65,928,929],{"class":85}," (",[65,931,899],{"class":78},[65,933,934],{"class":78}," element",[65,936,937],{"class":71}," in",[65,939,940],{"class":85}," elements)\n",[65,942,943],{"class":67,"line":110},[65,944,86],{"class":85},[65,946,947,950,952,955,957],{"class":67,"line":117},[65,948,949],{"class":85},"    Console.",[65,951,505],{"class":122},[65,953,954],{"class":85},"(element.",[65,956,869],{"class":122},[65,958,959],{"class":85},"());\n",[65,961,962],{"class":67,"line":138},[65,963,208],{"class":85},[10,965,967],{"id":966},"héritage-ou-interface","Héritage ou interface",[969,970,971,987],"table",{},[972,973,974],"thead",{},[975,976,977,981,984],"tr",{},[978,979,980],"th",{},"Critère",[978,982,983],{},"Héritage",[978,985,986],{},"Interface",[988,989,990,1002,1013],"tbody",{},[975,991,992,996,999],{},[993,994,995],"td",{},"Code partagé",[993,997,998],{},"Oui, la classe de base le contient",[993,1000,1001],{},"Non, seulement la liste des membres",[975,1003,1004,1007,1010],{},[993,1005,1006],{},"Nombre autorisé",[993,1008,1009],{},"Une seule classe de base",[993,1011,1012],{},"Autant que nécessaire",[975,1014,1015,1018,1021],{},[993,1016,1017],{},"Relation",[993,1019,1020],{},"« est un » (un Dessert est une Recette)",[993,1022,1023],{},"« sait faire » (peut donner un prix)",[1025,1026,1027],"tip",{},[37,1028,1029],{},"Quand tu hésites, choisis l'interface. L'héritage lie deux classes de façon durable, ce qui rend les changements plus difficiles plus tard.",[10,1031,1033],{"id":1032},"à-retenir","À retenir",[15,1035,1036,1046,1058,1067,1073],{},[18,1037,1038,1041,1042,1045],{},[25,1039,1040],{},"class B : A"," fait hériter B de A ; ",[25,1043,1044],{},": base(...)"," appelle le constructeur de la classe de base.",[18,1047,1048,1050,1051,1053,1054,1057],{},[25,1049,298],{}," autorise la redéfinition, ",[25,1052,302],{}," redéfinit, ",[25,1055,1056],{},"base."," appelle la version du parent.",[18,1059,1060,1061,1063,1064,1066],{},"Une classe ",[25,1062,628],{}," ne peut pas être créée seule ; ",[25,1065,723],{}," interdit l'héritage.",[18,1068,1069,1070,1072],{},"Une interface est un contrat sans code (",[25,1071,899],{},") qu'une classe implémente, et une classe peut en implémenter plusieurs.",[18,1074,1075],{},"Hérite pour partager du code entre classes proches, utilise une interface pour un comportement commun à des classes sans lien.",[1077,1078,1079],"style",{},"html pre.shiki code .sOnC1, html code.shiki .sOnC1{--shiki-light:#CF222E;--shiki-default:#FF7B72;--shiki-dark:#FF7B72}html pre.shiki code .sIXEE, html code.shiki .sIXEE{--shiki-light:#953800;--shiki-default:#FFA657;--shiki-dark:#FFA657}html pre.shiki code .scfrF, html code.shiki .scfrF{--shiki-light:#1F2328;--shiki-default:#E6EDF3;--shiki-dark:#E6EDF3}html pre.shiki code .syCW7, html code.shiki .syCW7{--shiki-light:#8250DF;--shiki-default:#D2A8FF;--shiki-dark:#D2A8FF}html pre.shiki code .shWOn, html code.shiki .shWOn{--shiki-light:#0A3069;--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}html pre.shiki code .s5iOY, html code.shiki .s5iOY{--shiki-light:#0550AE;--shiki-default:#79C0FF;--shiki-dark:#79C0FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sd6ml, html code.shiki .sd6ml{--shiki-light:#6E7781;--shiki-default:#8B949E;--shiki-dark:#8B949E}",{"title":61,"searchDepth":82,"depth":89,"links":1081},[1082,1083,1084,1085,1086,1087,1088,1089],{"id":12,"depth":82,"text":13},{"id":34,"depth":82,"text":35},{"id":291,"depth":82,"text":292},{"id":556,"depth":82,"text":557},{"id":621,"depth":82,"text":622},{"id":727,"depth":82,"text":728},{"id":966,"depth":82,"text":967},{"id":1032,"depth":82,"text":1033},"Réutiliser du code avec l'héritage, redéfinir un comportement avec virtual et override, et décrire un contrat commun avec une interface.","md",{},[1094,50,298,302,27,628,734,552,1095,1096],"héritage","implémentation","contrat","intermediaire","\u002Fcsharp\u002Fheritage-et-interfaces",[1100],"\u002Fcsharp\u002Fclasses-proprietes-records",[1102,1106,1110],{"nom":1103,"url":1104,"type":1105},"Parcours Microsoft Learn, Débuter avec C#","https:\u002F\u002Flearn.microsoft.com\u002Ffr-fr\u002Ftraining\u002Fpaths\u002Fget-started-c-sharp-part-1\u002F","cours",{"nom":1107,"url":1108,"type":1109},"Héritage en C# (Microsoft)","https:\u002F\u002Flearn.microsoft.com\u002Ffr-fr\u002Fdotnet\u002Fcsharp\u002Ffundamentals\u002Fobject-oriented\u002Finheritance","doc",{"nom":1111,"url":1112,"type":1109},"Interfaces en C# (Microsoft)","https:\u002F\u002Flearn.microsoft.com\u002Ffr-fr\u002Fdotnet\u002Fcsharp\u002Ffundamentals\u002Ftypes\u002Finterfaces",{"title":5,"description":1090},[1115,1117,1119],{"nom":1116,"url":1108},"Héritage en C#",{"nom":1118,"url":1112},"Interfaces en C#",{"nom":1120,"url":1121},"Documentation C#","https:\u002F\u002Flearn.microsoft.com\u002Ffr-fr\u002Fdotnet\u002Fcsharp\u002F","csharp\u002F05.heritage-et-interfaces","43MgCWynZy8VcCvewTLw4EsjRQnpRy9ncb6IuFqroS0",[1125,1129,1133,1137,1140,1141,1145],{"path":1126,"title":1127,"stem":1128},"\u002Fcsharp\u002Fpremier-programme","Premier programme C#","csharp\u002F01.premier-programme",{"path":1130,"title":1131,"stem":1132},"\u002Fcsharp\u002Fconditions-boucles-methodes","Conditions, boucles et méthodes","csharp\u002F02.conditions-boucles-methodes",{"path":1134,"title":1135,"stem":1136},"\u002Fcsharp\u002Fcollections-et-exceptions","Collections et exceptions","csharp\u002F03.collections-et-exceptions",{"path":1100,"title":1138,"stem":1139},"Classes, propriétés et records","csharp\u002F04.classes-proprietes-records",{"path":1098,"title":5,"stem":1122},{"path":1142,"title":1143,"stem":1144},"\u002Fcsharp\u002Flinq-et-async","LINQ et async\u002Fawait","csharp\u002F06.linq-et-async",{"path":1146,"title":1147,"stem":1148},"\u002Fcsharp","C#","csharp\u002Findex",[1150,1152],{"title":1138,"path":1100,"stem":1139,"description":1151,"children":-1},"Modéliser une recette avec une classe, ses propriétés et son constructeur, puis découvrir les records pour des données simples comparables par valeur.",{"title":1143,"path":1142,"stem":1144,"description":1153,"children":-1},"Filtrer, trier et calculer sur des collections avec LINQ, puis écrire du code asynchrone avec Task, async et await.",[1155],{"path":1100,"title":1138,"ligne":60},[1157,1159,1160,1161,1162,1163,1165],{"path":1126,"title":1127,"niveau":1158,"stem":1128},"debutant",{"path":1130,"title":1131,"niveau":1158,"stem":1132},{"path":1134,"title":1135,"niveau":1158,"stem":1136},{"path":1100,"title":1138,"niveau":1097,"stem":1139},{"path":1098,"title":5,"niveau":1097,"stem":1122},{"path":1142,"title":1143,"niveau":1164,"stem":1144},"avance",{"path":1146,"title":1147,"niveau":1166,"stem":1148},"memo",1794583458180]