CINXE.COM
Duck typing - Wikipedia, la enciclopedia libre
<!DOCTYPE html> <html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-enabled skin-theme-clientpref-day vector-toc-available" lang="es" dir="ltr"> <head> <meta charset="UTF-8"> <title>Duck typing - Wikipedia, la enciclopedia libre</title> <script>(function(){var className="client-js vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-enabled skin-theme-clientpref-day vector-toc-available";var cookie=document.cookie.match(/(?:^|; )eswikimwclientpreferences=([^;]+)/);if(cookie){cookie[1].split('%2C').forEach(function(pref){className=className.replace(new RegExp('(^| )'+pref.replace(/-clientpref-\w+$|[^\w-]+/g,'')+'-clientpref-\\w+( |$)'),'$1'+pref+'$2');});}document.documentElement.className=className;}());RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":[",\t."," \t,"],"wgDigitTransformTable":["",""], "wgDefaultDateFormat":"dmy","wgMonthNames":["","enero","febrero","marzo","abril","mayo","junio","julio","agosto","septiembre","octubre","noviembre","diciembre"],"wgRequestId":"9f76e149-a2eb-4a01-89a4-d35646b083df","wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"Duck_typing","wgTitle":"Duck typing","wgCurRevisionId":149223263,"wgRevisionId":149223263,"wgArticleId":3388525,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Lenguajes de programación orientada a objetos","Teoría de tipos"],"wgPageViewLanguage":"es","wgPageContentLanguage":"es","wgPageContentModel":"wikitext","wgRelevantPageName":"Duck_typing","wgRelevantArticleId":3388525,"wgIsProbablyEditable":true,"wgRelevantPageIsProbablyEditable":true,"wgRestrictionEdit":[],"wgRestrictionMove":[],"wgNoticeProject":"wikipedia","wgCiteReferencePreviewsActive":false,"wgMediaViewerOnClick":true,"wgMediaViewerEnabledByDefault": true,"wgPopupsFlags":0,"wgVisualEditor":{"pageLanguageCode":"es","pageLanguageDir":"ltr","pageVariantFallbacks":"es"},"wgMFDisplayWikibaseDescriptions":{"search":true,"watchlist":true,"tagline":true,"nearby":true},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":20000,"wgRelatedArticlesCompat":[],"wgCentralAuthMobileDomain":false,"wgEditSubmitButtonLabelPublish":true,"wgULSPosition":"interlanguage","wgULSisCompactLinksEnabled":false,"wgVector2022LanguageInHeader":true,"wgULSisLanguageSelectorEmpty":false,"wgWikibaseItemId":"Q374282","wgCheckUserClientHintsHeadersJsApi":["brands","architecture","bitness","fullVersionList","mobile","model","platform","platformVersion"],"GEHomepageSuggestedEditsEnableTopics":true,"wgGETopicsMatchModeEnabled":true,"wgGEStructuredTaskRejectionReasonTextInputEnabled":false,"wgGELevelingUpEnabledForUser":false};RLSTATE={"ext.gadget.imagenesinfobox":"ready","ext.globalCssJs.user.styles":"ready","site.styles":"ready","user.styles":"ready", "ext.globalCssJs.user":"ready","user":"ready","user.options":"loading","ext.cite.styles":"ready","ext.pygments":"ready","skins.vector.search.codex.styles":"ready","skins.vector.styles":"ready","skins.vector.icons":"ready","ext.wikimediamessages.styles":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","ext.uls.interlanguage":"ready","wikibase.client.init":"ready","ext.wikimediaBadges":"ready"};RLPAGEMODULES=["ext.cite.ux-enhancements","ext.pygments.view","site","mediawiki.page.ready","mediawiki.toc","skins.vector.js","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.gadget.a-commons-directo","ext.gadget.ReferenceTooltips","ext.gadget.refToolbar","ext.gadget.switcher","ext.urlShortener.toolbar","ext.centralauth.centralautologin","mmv.bootstrap","ext.popups","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.echo.centralauth","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.interface", "ext.cx.eventlogging.campaigns","ext.cx.uls.quick.actions","wikibase.client.vector-2022","ext.checkUser.clientHints","ext.growthExperiments.SuggestedEditSession","wikibase.sidebar.tracking"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.impl(function(){return["user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"}); }];});});</script> <link rel="stylesheet" href="/w/load.php?lang=es&modules=ext.cite.styles%7Cext.pygments%2CwikimediaBadges%7Cext.uls.interlanguage%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediamessages.styles%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles%7Cwikibase.client.init&only=styles&skin=vector-2022"> <script async="" src="/w/load.php?lang=es&modules=startup&only=scripts&raw=1&skin=vector-2022"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=es&modules=ext.gadget.imagenesinfobox&only=styles&skin=vector-2022"> <link rel="stylesheet" href="/w/load.php?lang=es&modules=site.styles&only=styles&skin=vector-2022"> <noscript><link rel="stylesheet" href="/w/load.php?lang=es&modules=noscript&only=styles&skin=vector-2022"></noscript> <meta name="generator" content="MediaWiki 1.44.0-wmf.4"> <meta name="referrer" content="origin"> <meta name="referrer" content="origin-when-cross-origin"> <meta name="robots" content="max-image-preview:standard"> <meta name="format-detection" content="telephone=no"> <meta name="viewport" content="width=1120"> <meta property="og:title" content="Duck typing - Wikipedia, la enciclopedia libre"> <meta property="og:type" content="website"> <link rel="preconnect" href="//upload.wikimedia.org"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//es.m.wikipedia.org/wiki/Duck_typing"> <link rel="alternate" type="application/x-wiki" title="Editar" href="/w/index.php?title=Duck_typing&action=edit"> <link rel="apple-touch-icon" href="/static/apple-touch/wikipedia.png"> <link rel="icon" href="/static/favicon/wikipedia.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/w/rest.php/v1/search" title="Wikipedia (es)"> <link rel="EditURI" type="application/rsd+xml" href="//es.wikipedia.org/w/api.php?action=rsd"> <link rel="canonical" href="https://es.wikipedia.org/wiki/Duck_typing"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/deed.es"> <link rel="alternate" type="application/atom+xml" title="Canal Atom de Wikipedia" href="/w/index.php?title=Especial:CambiosRecientes&feed=atom"> <link rel="dns-prefetch" href="//meta.wikimedia.org" /> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject mw-editable page-Duck_typing rootpage-Duck_typing skin-vector-2022 action-view"><a class="mw-jump-link" href="#bodyContent">Ir al contenido</a> <div class="vector-header-container"> <header class="vector-header mw-header"> <div class="vector-header-start"> <nav class="vector-main-menu-landmark" aria-label="Sitio"> <div id="vector-main-menu-dropdown" class="vector-dropdown vector-main-menu-dropdown vector-button-flush-left vector-button-flush-right" > <input type="checkbox" id="vector-main-menu-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-main-menu-dropdown" class="vector-dropdown-checkbox " aria-label="Menú principal" > <label id="vector-main-menu-dropdown-label" for="vector-main-menu-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-menu mw-ui-icon-wikimedia-menu"></span> <span class="vector-dropdown-label-text">Menú principal</span> </label> <div class="vector-dropdown-content"> <div id="vector-main-menu-unpinned-container" class="vector-unpinned-container"> <div id="vector-main-menu" class="vector-main-menu vector-pinnable-element"> <div class="vector-pinnable-header vector-main-menu-pinnable-header vector-pinnable-header-unpinned" data-feature-name="main-menu-pinned" data-pinnable-element-id="vector-main-menu" data-pinned-container-id="vector-main-menu-pinned-container" data-unpinned-container-id="vector-main-menu-unpinned-container" > <div class="vector-pinnable-header-label">Menú principal</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-main-menu.pin">mover a la barra lateral</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-main-menu.unpin">ocultar</button> </div> <div id="p-navigation" class="vector-menu mw-portlet mw-portlet-navigation" > <div class="vector-menu-heading"> Navegación </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mainpage-description" class="mw-list-item"><a href="/wiki/Wikipedia:Portada" title="Visitar la página principal [z]" accesskey="z"><span>Portada</span></a></li><li id="n-portal" class="mw-list-item"><a href="/wiki/Portal:Comunidad" title="Acerca del proyecto, lo que puedes hacer, dónde encontrar información"><span>Portal de la comunidad</span></a></li><li id="n-currentevents" class="mw-list-item"><a href="/wiki/Portal:Actualidad" title="Encuentra información de contexto sobre acontecimientos actuales"><span>Actualidad</span></a></li><li id="n-recentchanges" class="mw-list-item"><a href="/wiki/Especial:CambiosRecientes" title="Lista de cambios recientes en la wiki [r]" accesskey="r"><span>Cambios recientes</span></a></li><li id="n-newpages" class="mw-list-item"><a href="/wiki/Especial:P%C3%A1ginasNuevas"><span>Páginas nuevas</span></a></li><li id="n-randompage" class="mw-list-item"><a href="/wiki/Especial:Aleatoria" title="Cargar una página al azar [x]" accesskey="x"><span>Página aleatoria</span></a></li><li id="n-help" class="mw-list-item"><a href="/wiki/Ayuda:Contenidos" title="El lugar para aprender"><span>Ayuda</span></a></li><li id="n-bug_in_article" class="mw-list-item"><a href="/wiki/Wikipedia:Informes_de_error"><span>Notificar un error</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> <a href="/wiki/Wikipedia:Portada" class="mw-logo"> <img class="mw-logo-icon" src="/static/images/icons/wikipedia.png" alt="" aria-hidden="true" height="50" width="50"> <span class="mw-logo-container skin-invert"> <img class="mw-logo-wordmark" alt="Wikipedia" src="/static/images/mobile/copyright/wikipedia-wordmark-en.svg" style="width: 7.5em; height: 1.125em;"> <img class="mw-logo-tagline" alt="La enciclopedia libre" src="/static/images/mobile/copyright/wikipedia-tagline-es.svg" width="120" height="13" style="width: 7.5em; height: 0.8125em;"> </span> </a> </div> <div class="vector-header-end"> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-collapses vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <a href="/wiki/Especial:Buscar" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only search-toggle" title="Buscar en este wiki [f]" accesskey="f"><span class="vector-icon mw-ui-icon-search mw-ui-icon-wikimedia-search"></span> <span>Buscar</span> </a> <div class="vector-typeahead-search-container"> <div class="cdx-typeahead-search cdx-typeahead-search--show-thumbnail cdx-typeahead-search--auto-expand-width"> <form action="/w/index.php" id="searchform" class="cdx-search-input cdx-search-input--has-end-button"> <div id="simpleSearch" class="cdx-search-input__input-wrapper" data-search-loc="header-moved"> <div class="cdx-text-input cdx-text-input--has-start-icon"> <input class="cdx-text-input__input" type="search" name="search" placeholder="Buscar en Wikipedia" aria-label="Buscar en Wikipedia" autocapitalize="sentences" title="Buscar en este wiki [f]" accesskey="f" id="searchInput" > <span class="cdx-text-input__icon cdx-text-input__start-icon"></span> </div> <input type="hidden" name="title" value="Especial:Buscar"> </div> <button class="cdx-button cdx-search-input__end-button">Buscar</button> </form> </div> </div> </div> <nav class="vector-user-links vector-user-links-wide" aria-label="Herramientas personales"> <div class="vector-user-links-main"> <div id="p-vector-user-menu-preferences" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-userpage" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <nav class="vector-appearance-landmark" aria-label="Apariencia"> <div id="vector-appearance-dropdown" class="vector-dropdown " title="Change the appearance of the page's font size, width, and color" > <input type="checkbox" id="vector-appearance-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-appearance-dropdown" class="vector-dropdown-checkbox " aria-label="Apariencia" > <label id="vector-appearance-dropdown-label" for="vector-appearance-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-appearance mw-ui-icon-wikimedia-appearance"></span> <span class="vector-dropdown-label-text">Apariencia</span> </label> <div class="vector-dropdown-content"> <div id="vector-appearance-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <div id="p-vector-user-menu-notifications" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-overflow" class="vector-menu mw-portlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="//donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_es.wikipedia.org&uselang=es" class=""><span>Donaciones</span></a> </li> <li id="pt-createaccount-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Especial:Crear_una_cuenta&returnto=Duck+typing" title="Te recomendamos crear una cuenta e iniciar sesión; sin embargo, no es obligatorio" class=""><span>Crear una cuenta</span></a> </li> <li id="pt-login-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Especial:Entrar&returnto=Duck+typing" title="Te recomendamos iniciar sesión, aunque no es obligatorio [o]" accesskey="o" class=""><span>Acceder</span></a> </li> </ul> </div> </div> </div> <div id="vector-user-links-dropdown" class="vector-dropdown vector-user-menu vector-button-flush-right vector-user-menu-logged-out" title="Más opciones" > <input type="checkbox" id="vector-user-links-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-user-links-dropdown" class="vector-dropdown-checkbox " aria-label="Herramientas personales" > <label id="vector-user-links-dropdown-label" for="vector-user-links-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-ellipsis mw-ui-icon-wikimedia-ellipsis"></span> <span class="vector-dropdown-label-text">Herramientas personales</span> </label> <div class="vector-dropdown-content"> <div id="p-personal" class="vector-menu mw-portlet mw-portlet-personal user-links-collapsible-item" title="Menú de usuario" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport" class="user-links-collapsible-item mw-list-item"><a href="//donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_es.wikipedia.org&uselang=es"><span>Donaciones</span></a></li><li id="pt-createaccount" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Especial:Crear_una_cuenta&returnto=Duck+typing" title="Te recomendamos crear una cuenta e iniciar sesión; sin embargo, no es obligatorio"><span class="vector-icon mw-ui-icon-userAdd mw-ui-icon-wikimedia-userAdd"></span> <span>Crear una cuenta</span></a></li><li id="pt-login" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Especial:Entrar&returnto=Duck+typing" title="Te recomendamos iniciar sesión, aunque no es obligatorio [o]" accesskey="o"><span class="vector-icon mw-ui-icon-logIn mw-ui-icon-wikimedia-logIn"></span> <span>Acceder</span></a></li> </ul> </div> </div> <div id="p-user-menu-anon-editor" class="vector-menu mw-portlet mw-portlet-user-menu-anon-editor" > <div class="vector-menu-heading"> Páginas para editores desconectados <a href="/wiki/Ayuda:Introducci%C3%B3n" aria-label="Obtenga más información sobre editar"><span>más información</span></a> </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-anoncontribs" class="mw-list-item"><a href="/wiki/Especial:MisContribuciones" title="Una lista de modificaciones hechas desde esta dirección IP [y]" accesskey="y"><span>Contribuciones</span></a></li><li id="pt-anontalk" class="mw-list-item"><a href="/wiki/Especial:MiDiscusi%C3%B3n" title="Discusión sobre ediciones hechas desde esta dirección IP [n]" accesskey="n"><span>Discusión</span></a></li> </ul> </div> </div> </div> </div> </nav> </div> </header> </div> <div class="mw-page-container"> <div class="mw-page-container-inner"> <div class="vector-sitenotice-container"> <div id="siteNotice"><!-- CentralNotice --></div> </div> <div class="vector-column-start"> <div class="vector-main-menu-container"> <div id="mw-navigation"> <nav id="mw-panel" class="vector-main-menu-landmark" aria-label="Sitio"> <div id="vector-main-menu-pinned-container" class="vector-pinned-container"> </div> </nav> </div> </div> <div class="vector-sticky-pinned-container"> <nav id="mw-panel-toc" aria-label="Contenidos" data-event-name="ui.sidebar-toc" class="mw-table-of-contents-container vector-toc-landmark"> <div id="vector-toc-pinned-container" class="vector-pinned-container"> <div id="vector-toc" class="vector-toc vector-pinnable-element"> <div class="vector-pinnable-header vector-toc-pinnable-header vector-pinnable-header-pinned" data-feature-name="toc-pinned" data-pinnable-element-id="vector-toc" > <h2 class="vector-pinnable-header-label">Contenidos</h2> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-toc.pin">mover a la barra lateral</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-toc.unpin">ocultar</button> </div> <ul class="vector-toc-contents" id="mw-panel-toc-list"> <li id="toc-mw-content-text" class="vector-toc-list-item vector-toc-level-1"> <a href="#" class="vector-toc-link"> <div class="vector-toc-text">Inicio</div> </a> </li> <li id="toc-Ejemplos_del_concepto" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Ejemplos_del_concepto"> <div class="vector-toc-text"> <span class="vector-toc-numb">1</span> <span>Ejemplos del concepto</span> </div> </a> <ul id="toc-Ejemplos_del_concepto-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Duck_typing_en_lenguajes_de_tipificación_estática" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Duck_typing_en_lenguajes_de_tipificación_estática"> <div class="vector-toc-text"> <span class="vector-toc-numb">2</span> <span>Duck typing en lenguajes de tipificación estática</span> </div> </a> <ul id="toc-Duck_typing_en_lenguajes_de_tipificación_estática-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Comparación_con_otros_tipos_de_tipificación" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Comparación_con_otros_tipos_de_tipificación"> <div class="vector-toc-text"> <span class="vector-toc-numb">3</span> <span>Comparación con otros tipos de tipificación</span> </div> </a> <button aria-controls="toc-Comparación_con_otros_tipos_de_tipificación-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Alternar subsección Comparación con otros tipos de tipificación</span> </button> <ul id="toc-Comparación_con_otros_tipos_de_tipificación-sublist" class="vector-toc-list"> <li id="toc-Sistemas_de_tipificación_estructural" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Sistemas_de_tipificación_estructural"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.1</span> <span>Sistemas de tipificación estructural</span> </div> </a> <ul id="toc-Sistemas_de_tipificación_estructural-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Interfaces" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Interfaces"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.2</span> <span>Interfaces</span> </div> </a> <ul id="toc-Interfaces-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Templates_o_tipos_genéricos" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#Templates_o_tipos_genéricos"> <div class="vector-toc-text"> <span class="vector-toc-numb">3.3</span> <span>Templates o tipos genéricos</span> </div> </a> <ul id="toc-Templates_o_tipos_genéricos-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Críticas" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Críticas"> <div class="vector-toc-text"> <span class="vector-toc-numb">4</span> <span>Críticas</span> </div> </a> <ul id="toc-Críticas-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Historia" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Historia"> <div class="vector-toc-text"> <span class="vector-toc-numb">5</span> <span>Historia</span> </div> </a> <ul id="toc-Historia-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Implementaciones" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Implementaciones"> <div class="vector-toc-text"> <span class="vector-toc-numb">6</span> <span>Implementaciones</span> </div> </a> <button aria-controls="toc-Implementaciones-sublist" class="cdx-button cdx-button--weight-quiet cdx-button--icon-only vector-toc-toggle"> <span class="vector-icon mw-ui-icon-wikimedia-expand"></span> <span>Alternar subsección Implementaciones</span> </button> <ul id="toc-Implementaciones-sublist" class="vector-toc-list"> <li id="toc-En_C#" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#En_C#"> <div class="vector-toc-text"> <span class="vector-toc-numb">6.1</span> <span>En C#</span> </div> </a> <ul id="toc-En_C#-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-En_ColdFusion" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#En_ColdFusion"> <div class="vector-toc-text"> <span class="vector-toc-numb">6.2</span> <span>En ColdFusion</span> </div> </a> <ul id="toc-En_ColdFusion-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-En_Common_Lisp" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#En_Common_Lisp"> <div class="vector-toc-text"> <span class="vector-toc-numb">6.3</span> <span>En Common Lisp</span> </div> </a> <ul id="toc-En_Common_Lisp-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-En_Objective-C" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#En_Objective-C"> <div class="vector-toc-text"> <span class="vector-toc-numb">6.4</span> <span>En Objective-C</span> </div> </a> <ul id="toc-En_Objective-C-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-En_Python" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#En_Python"> <div class="vector-toc-text"> <span class="vector-toc-numb">6.5</span> <span>En Python</span> </div> </a> <ul id="toc-En_Python-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-En_Julia" class="vector-toc-list-item vector-toc-level-2"> <a class="vector-toc-link" href="#En_Julia"> <div class="vector-toc-text"> <span class="vector-toc-numb">6.6</span> <span>En Julia</span> </div> </a> <ul id="toc-En_Julia-sublist" class="vector-toc-list"> </ul> </li> </ul> </li> <li id="toc-Referencias" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Referencias"> <div class="vector-toc-text"> <span class="vector-toc-numb">7</span> <span>Referencias</span> </div> </a> <ul id="toc-Referencias-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Enlaces_externos" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Enlaces_externos"> <div class="vector-toc-text"> <span class="vector-toc-numb">8</span> <span>Enlaces externos</span> </div> </a> <ul id="toc-Enlaces_externos-sublist" class="vector-toc-list"> </ul> </li> </ul> </div> </div> </nav> </div> </div> <div class="mw-content-container"> <main id="content" class="mw-body"> <header class="mw-body-header vector-page-titlebar"> <nav aria-label="Contenidos" class="vector-toc-landmark"> <div id="vector-page-titlebar-toc" class="vector-dropdown vector-page-titlebar-toc vector-button-flush-left" > <input type="checkbox" id="vector-page-titlebar-toc-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-titlebar-toc" class="vector-dropdown-checkbox " aria-label="Cambiar a la tabla de contenidos" > <label id="vector-page-titlebar-toc-label" for="vector-page-titlebar-toc-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-listBullet mw-ui-icon-wikimedia-listBullet"></span> <span class="vector-dropdown-label-text">Cambiar a la tabla de contenidos</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-titlebar-toc-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">Duck typing</span></h1> <div id="p-lang-btn" class="vector-dropdown mw-portlet mw-portlet-lang" > <input type="checkbox" id="p-lang-btn-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-lang-btn" class="vector-dropdown-checkbox mw-interlanguage-selector" aria-label="Ir a un artículo en otro idioma. Disponible en 24 idiomas" > <label id="p-lang-btn-label" for="p-lang-btn-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--action-progressive mw-portlet-lang-heading-24" aria-hidden="true" ><span class="vector-icon mw-ui-icon-language-progressive mw-ui-icon-wikimedia-language-progressive"></span> <span class="vector-dropdown-label-text">24 idiomas</span> </label> <div class="vector-dropdown-content"> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li class="interlanguage-link interwiki-ar mw-list-item"><a href="https://ar.wikipedia.org/wiki/%D8%AA%D9%86%D9%88%D9%8A%D8%B9_%D8%A7%D9%84%D8%A8%D8%B7" title="تنويع البط (árabe)" lang="ar" hreflang="ar" data-title="تنويع البط" data-language-autonym="العربية" data-language-local-name="árabe" class="interlanguage-link-target"><span>العربية</span></a></li><li class="interlanguage-link interwiki-be-x-old mw-list-item"><a href="https://be-tarask.wikipedia.org/wiki/%D0%9A%D0%B0%D1%87%D1%8B%D0%BD%D0%B0%D1%8F_%D1%82%D1%8B%D0%BF%D1%96%D0%B7%D0%B0%D1%86%D1%8B%D1%8F" title="Качыная тыпізацыя (Belarusian (Taraškievica orthography))" lang="be-tarask" hreflang="be-tarask" data-title="Качыная тыпізацыя" data-language-autonym="Беларуская (тарашкевіца)" data-language-local-name="Belarusian (Taraškievica orthography)" class="interlanguage-link-target"><span>Беларуская (тарашкевіца)</span></a></li><li class="interlanguage-link interwiki-cs mw-list-item"><a href="https://cs.wikipedia.org/wiki/Duck-typing" title="Duck-typing (checo)" lang="cs" hreflang="cs" data-title="Duck-typing" data-language-autonym="Čeština" data-language-local-name="checo" class="interlanguage-link-target"><span>Čeština</span></a></li><li class="interlanguage-link interwiki-de mw-list-item"><a href="https://de.wikipedia.org/wiki/Duck-Typing" title="Duck-Typing (alemán)" lang="de" hreflang="de" data-title="Duck-Typing" data-language-autonym="Deutsch" data-language-local-name="alemán" class="interlanguage-link-target"><span>Deutsch</span></a></li><li class="interlanguage-link interwiki-en mw-list-item"><a href="https://en.wikipedia.org/wiki/Duck_typing" title="Duck typing (inglés)" lang="en" hreflang="en" data-title="Duck typing" data-language-autonym="English" data-language-local-name="inglés" class="interlanguage-link-target"><span>English</span></a></li><li class="interlanguage-link interwiki-fa mw-list-item"><a href="https://fa.wikipedia.org/wiki/%D9%86%D9%88%D8%B9%E2%80%8C%D8%AF%D9%87%DB%8C_%D8%A7%D8%B1%D8%AF%DA%A9%DB%8C" title="نوعدهی اردکی (persa)" lang="fa" hreflang="fa" data-title="نوعدهی اردکی" data-language-autonym="فارسی" data-language-local-name="persa" class="interlanguage-link-target"><span>فارسی</span></a></li><li class="interlanguage-link interwiki-fi mw-list-item"><a href="https://fi.wikipedia.org/wiki/Ankkatyypitys" title="Ankkatyypitys (finés)" lang="fi" hreflang="fi" data-title="Ankkatyypitys" data-language-autonym="Suomi" data-language-local-name="finés" class="interlanguage-link-target"><span>Suomi</span></a></li><li class="interlanguage-link interwiki-fr mw-list-item"><a href="https://fr.wikipedia.org/wiki/Duck_typing" title="Duck typing (francés)" lang="fr" hreflang="fr" data-title="Duck typing" data-language-autonym="Français" data-language-local-name="francés" class="interlanguage-link-target"><span>Français</span></a></li><li class="interlanguage-link interwiki-gl mw-list-item"><a href="https://gl.wikipedia.org/wiki/Tipado_Pato" title="Tipado Pato (gallego)" lang="gl" hreflang="gl" data-title="Tipado Pato" data-language-autonym="Galego" data-language-local-name="gallego" class="interlanguage-link-target"><span>Galego</span></a></li><li class="interlanguage-link interwiki-it mw-list-item"><a href="https://it.wikipedia.org/wiki/Duck_typing" title="Duck typing (italiano)" lang="it" hreflang="it" data-title="Duck typing" data-language-autonym="Italiano" data-language-local-name="italiano" class="interlanguage-link-target"><span>Italiano</span></a></li><li class="interlanguage-link interwiki-ja mw-list-item"><a href="https://ja.wikipedia.org/wiki/%E3%83%80%E3%83%83%E3%82%AF%E3%83%BB%E3%82%BF%E3%82%A4%E3%83%94%E3%83%B3%E3%82%B0" title="ダック・タイピング (japonés)" lang="ja" hreflang="ja" data-title="ダック・タイピング" data-language-autonym="日本語" data-language-local-name="japonés" class="interlanguage-link-target"><span>日本語</span></a></li><li class="interlanguage-link interwiki-ko mw-list-item"><a href="https://ko.wikipedia.org/wiki/%EB%8D%95_%ED%83%80%EC%9D%B4%ED%95%91" title="덕 타이핑 (coreano)" lang="ko" hreflang="ko" data-title="덕 타이핑" data-language-autonym="한국어" data-language-local-name="coreano" class="interlanguage-link-target"><span>한국어</span></a></li><li class="interlanguage-link interwiki-ml mw-list-item"><a href="https://ml.wikipedia.org/wiki/%E0%B4%A1%E0%B4%95%E0%B5%8D%E0%B4%95%E0%B5%8D_%E0%B4%9F%E0%B5%88%E0%B4%AA%E0%B5%8D%E0%B4%AA%E0%B4%BF%E0%B4%82%E0%B4%97%E0%B5%8D" title="ഡക്ക് ടൈപ്പിംഗ് (malayálam)" lang="ml" hreflang="ml" data-title="ഡക്ക് ടൈപ്പിംഗ്" data-language-autonym="മലയാളം" data-language-local-name="malayálam" class="interlanguage-link-target"><span>മലയാളം</span></a></li><li class="interlanguage-link interwiki-ms mw-list-item"><a href="https://ms.wikipedia.org/wiki/Penjenisan_itik" title="Penjenisan itik (malayo)" lang="ms" hreflang="ms" data-title="Penjenisan itik" data-language-autonym="Bahasa Melayu" data-language-local-name="malayo" class="interlanguage-link-target"><span>Bahasa Melayu</span></a></li><li class="interlanguage-link interwiki-nl mw-list-item"><a href="https://nl.wikipedia.org/wiki/Duck-typing" title="Duck-typing (neerlandés)" lang="nl" hreflang="nl" data-title="Duck-typing" data-language-autonym="Nederlands" data-language-local-name="neerlandés" class="interlanguage-link-target"><span>Nederlands</span></a></li><li class="interlanguage-link interwiki-pl mw-list-item"><a href="https://pl.wikipedia.org/wiki/Duck_typing" title="Duck typing (polaco)" lang="pl" hreflang="pl" data-title="Duck typing" data-language-autonym="Polski" data-language-local-name="polaco" class="interlanguage-link-target"><span>Polski</span></a></li><li class="interlanguage-link interwiki-pt mw-list-item"><a href="https://pt.wikipedia.org/wiki/Duck_typing" title="Duck typing (portugués)" lang="pt" hreflang="pt" data-title="Duck typing" data-language-autonym="Português" data-language-local-name="portugués" class="interlanguage-link-target"><span>Português</span></a></li><li class="interlanguage-link interwiki-ru mw-list-item"><a href="https://ru.wikipedia.org/wiki/%D0%A3%D1%82%D0%B8%D0%BD%D0%B0%D1%8F_%D1%82%D0%B8%D0%BF%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F" title="Утиная типизация (ruso)" lang="ru" hreflang="ru" data-title="Утиная типизация" data-language-autonym="Русский" data-language-local-name="ruso" class="interlanguage-link-target"><span>Русский</span></a></li><li class="interlanguage-link interwiki-simple mw-list-item"><a href="https://simple.wikipedia.org/wiki/Duck_typing" title="Duck typing (Simple English)" lang="en-simple" hreflang="en-simple" data-title="Duck typing" data-language-autonym="Simple English" data-language-local-name="Simple English" class="interlanguage-link-target"><span>Simple English</span></a></li><li class="interlanguage-link interwiki-sv mw-list-item"><a href="https://sv.wikipedia.org/wiki/Duck_typing" title="Duck typing (sueco)" lang="sv" hreflang="sv" data-title="Duck typing" data-language-autonym="Svenska" data-language-local-name="sueco" class="interlanguage-link-target"><span>Svenska</span></a></li><li class="interlanguage-link interwiki-th mw-list-item"><a href="https://th.wikipedia.org/wiki/%E0%B8%94%E0%B8%B1%E0%B8%81%E0%B9%84%E0%B8%97%E0%B8%9B%E0%B8%9B%E0%B8%B4%E0%B8%87" title="ดักไทปปิง (tailandés)" lang="th" hreflang="th" data-title="ดักไทปปิง" data-language-autonym="ไทย" data-language-local-name="tailandés" class="interlanguage-link-target"><span>ไทย</span></a></li><li class="interlanguage-link interwiki-tr mw-list-item"><a href="https://tr.wikipedia.org/wiki/Duck_Typing" title="Duck Typing (turco)" lang="tr" hreflang="tr" data-title="Duck Typing" data-language-autonym="Türkçe" data-language-local-name="turco" class="interlanguage-link-target"><span>Türkçe</span></a></li><li class="interlanguage-link interwiki-uk mw-list-item"><a href="https://uk.wikipedia.org/wiki/%D0%9A%D0%B0%D1%87%D0%B8%D0%BD%D0%B0_%D1%82%D0%B8%D0%BF%D1%96%D0%B7%D0%B0%D1%86%D1%96%D1%8F" title="Качина типізація (ucraniano)" lang="uk" hreflang="uk" data-title="Качина типізація" data-language-autonym="Українська" data-language-local-name="ucraniano" class="interlanguage-link-target"><span>Українська</span></a></li><li class="interlanguage-link interwiki-zh mw-list-item"><a href="https://zh.wikipedia.org/wiki/%E9%B8%AD%E5%AD%90%E7%B1%BB%E5%9E%8B" title="鸭子类型 (chino)" lang="zh" hreflang="zh" data-title="鸭子类型" data-language-autonym="中文" data-language-local-name="chino" class="interlanguage-link-target"><span>中文</span></a></li> </ul> <div class="after-portlet after-portlet-lang"><span class="wb-langlinks-edit wb-langlinks-link"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q374282#sitelinks-wikipedia" title="Editar enlaces interlingüísticos" class="wbc-editpage">Editar enlaces</a></span></div> </div> </div> </div> </header> <div class="vector-page-toolbar"> <div class="vector-page-toolbar-container"> <div id="left-navigation"> <nav aria-label="Espacios de nombres"> <div id="p-associated-pages" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-associated-pages" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-main" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Duck_typing" title="Ver la página de contenido [c]" accesskey="c"><span>Artículo</span></a></li><li id="ca-talk" class="vector-tab-noicon mw-list-item"><a href="/wiki/Discusi%C3%B3n:Duck_typing" rel="discussion" title="Discusión acerca de la página [t]" accesskey="t"><span>Discusión</span></a></li> </ul> </div> </div> <div id="vector-variants-dropdown" class="vector-dropdown emptyPortlet" > <input type="checkbox" id="vector-variants-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-variants-dropdown" class="vector-dropdown-checkbox " aria-label="Cambiar variante de idioma" > <label id="vector-variants-dropdown-label" for="vector-variants-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">español</span> </label> <div class="vector-dropdown-content"> <div id="p-variants" class="vector-menu mw-portlet mw-portlet-variants emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </nav> </div> <div id="right-navigation" class="vector-collapsible"> <nav aria-label="Vistas"> <div id="p-views" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-views" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/Duck_typing"><span>Leer</span></a></li><li id="ca-edit" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Duck_typing&action=edit" title="Editar esta página [e]" accesskey="e"><span>Editar</span></a></li><li id="ca-history" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=Duck_typing&action=history" title="Versiones anteriores de esta página [h]" accesskey="h"><span>Ver historial</span></a></li> </ul> </div> </div> </nav> <nav class="vector-page-tools-landmark" aria-label="Página de herramientas"> <div id="vector-page-tools-dropdown" class="vector-dropdown vector-page-tools-dropdown" > <input type="checkbox" id="vector-page-tools-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-tools-dropdown" class="vector-dropdown-checkbox " aria-label="Herramientas" > <label id="vector-page-tools-dropdown-label" for="vector-page-tools-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">Herramientas</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-tools-unpinned-container" class="vector-unpinned-container"> <div id="vector-page-tools" class="vector-page-tools vector-pinnable-element"> <div class="vector-pinnable-header vector-page-tools-pinnable-header vector-pinnable-header-unpinned" data-feature-name="page-tools-pinned" data-pinnable-element-id="vector-page-tools" data-pinned-container-id="vector-page-tools-pinned-container" data-unpinned-container-id="vector-page-tools-unpinned-container" > <div class="vector-pinnable-header-label">Herramientas</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-page-tools.pin">mover a la barra lateral</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-page-tools.unpin">ocultar</button> </div> <div id="p-cactions" class="vector-menu mw-portlet mw-portlet-cactions emptyPortlet vector-has-collapsible-items" title="Más opciones" > <div class="vector-menu-heading"> Acciones </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-more-view" class="selected vector-more-collapsible-item mw-list-item"><a href="/wiki/Duck_typing"><span>Leer</span></a></li><li id="ca-more-edit" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Duck_typing&action=edit" title="Editar esta página [e]" accesskey="e"><span>Editar</span></a></li><li id="ca-more-history" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=Duck_typing&action=history"><span>Ver historial</span></a></li> </ul> </div> </div> <div id="p-tb" class="vector-menu mw-portlet mw-portlet-tb" > <div class="vector-menu-heading"> General </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-whatlinkshere" class="mw-list-item"><a href="/wiki/Especial:LoQueEnlazaAqu%C3%AD/Duck_typing" title="Lista de todas las páginas de la wiki que enlazan aquí [j]" accesskey="j"><span>Lo que enlaza aquí</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/Especial:CambiosEnEnlazadas/Duck_typing" rel="nofollow" title="Cambios recientes en las páginas que enlazan con esta [k]" accesskey="k"><span>Cambios en enlazadas</span></a></li><li id="t-upload" class="mw-list-item"><a href="//commons.wikimedia.org/wiki/Special:UploadWizard?uselang=es" title="Subir archivos [u]" accesskey="u"><span>Subir archivo</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/wiki/Especial:P%C3%A1ginasEspeciales" title="Lista de todas las páginas especiales [q]" accesskey="q"><span>Páginas especiales</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/w/index.php?title=Duck_typing&oldid=149223263" title="Enlace permanente a esta versión de la página"><span>Enlace permanente</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=Duck_typing&action=info" title="Más información sobre esta página"><span>Información de la página</span></a></li><li id="t-cite" class="mw-list-item"><a href="/w/index.php?title=Especial:Citar&page=Duck_typing&id=149223263&wpFormIdentifier=titleform" title="Información sobre cómo citar esta página"><span>Citar esta página</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=Especial:Acortador_de_URL&url=https%3A%2F%2Fes.wikipedia.org%2Fwiki%2FDuck_typing"><span>Obtener URL acortado</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=Especial:QrCode&url=https%3A%2F%2Fes.wikipedia.org%2Fwiki%2FDuck_typing"><span>Descargar código QR</span></a></li> </ul> </div> </div> <div id="p-coll-print_export" class="vector-menu mw-portlet mw-portlet-coll-print_export" > <div class="vector-menu-heading"> Imprimir/exportar </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="coll-create_a_book" class="mw-list-item"><a href="/w/index.php?title=Especial:Libro&bookcmd=book_creator&referer=Duck+typing"><span>Crear un libro</span></a></li><li id="coll-download-as-rl" class="mw-list-item"><a href="/w/index.php?title=Especial:DownloadAsPdf&page=Duck_typing&action=show-download-screen"><span>Descargar como PDF</span></a></li><li id="t-print" class="mw-list-item"><a href="/w/index.php?title=Duck_typing&printable=yes" title="Versión imprimible de esta página [p]" accesskey="p"><span>Versión para imprimir</span></a></li> </ul> </div> </div> <div id="p-wikibase-otherprojects" class="vector-menu mw-portlet mw-portlet-wikibase-otherprojects" > <div class="vector-menu-heading"> En otros proyectos </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-wikibase" class="wb-otherproject-link wb-otherproject-wikibase-dataitem mw-list-item"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q374282" title="Enlace al elemento conectado del repositorio de datos [g]" accesskey="g"><span>Elemento de Wikidata</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> </div> </div> </div> <div class="vector-column-end"> <div class="vector-sticky-pinned-container"> <nav class="vector-page-tools-landmark" aria-label="Página de herramientas"> <div id="vector-page-tools-pinned-container" class="vector-pinned-container"> </div> </nav> <nav class="vector-appearance-landmark" aria-label="Apariencia"> <div id="vector-appearance-pinned-container" class="vector-pinned-container"> <div id="vector-appearance" class="vector-appearance vector-pinnable-element"> <div class="vector-pinnable-header vector-appearance-pinnable-header vector-pinnable-header-pinned" data-feature-name="appearance-pinned" data-pinnable-element-id="vector-appearance" data-pinned-container-id="vector-appearance-pinned-container" data-unpinned-container-id="vector-appearance-unpinned-container" > <div class="vector-pinnable-header-label">Apariencia</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-appearance.pin">mover a la barra lateral</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-appearance.unpin">ocultar</button> </div> </div> </div> </nav> </div> </div> <div id="bodyContent" class="vector-body" aria-labelledby="firstHeading" data-mw-ve-target-container> <div class="vector-body-before-content"> <div class="mw-indicators"> </div> <div id="siteSub" class="noprint">De Wikipedia, la enciclopedia libre</div> </div> <div id="contentSub"><div id="mw-content-subtitle"></div></div> <div id="mw-content-text" class="mw-body-content"><div class="mw-content-ltr mw-parser-output" lang="es" dir="ltr"><p>En los <a href="/wiki/Lenguajes_de_programaci%C3%B3n" class="mw-redirect" title="Lenguajes de programación">lenguajes de programación</a> <a href="/wiki/Objetos_(programaci%C3%B3n_orientada_a_objetos)" class="mw-redirect" title="Objetos (programación orientada a objetos)">orientados a objetos</a>, se conoce como <b>duck typing</b> o <b>tipado pato</b> el estilo de <a href="/wiki/Sistema_de_tipificaci%C3%B3n" class="mw-redirect" title="Sistema de tipificación">tipificación dinámica de datos</a> en que <i>el conjunto actual de <a href="/wiki/Clase_(inform%C3%A1tica)#Métodos_en_las_clases" title="Clase (informática)">métodos</a> y propiedades</i> determina la validez semántica, en vez de que lo hagan la herencia de una clase en particular o la implementación de una interfaz específica. El nombre del concepto se refiere a la <i>prueba del pato</i>, una humorada de <a href="/wiki/Razonamiento_inductivo" title="Razonamiento inductivo">razonamiento inductivo</a> atribuida a <a href="/w/index.php?title=James_Whitcomb_Riley&action=edit&redlink=1" class="new" title="James Whitcomb Riley (aún no redactado)">James Whitcomb Riley</a> (ver <a href="#Historia">Historia</a> más abajo), que pudo ser como sigue: </p> <dl><dd>"Cuando veo un ave que camina como un pato, nada como un pato y suena como un pato, a esa ave yo la llamo un pato."<sup id="cite_ref-1" class="reference separada"><a href="#cite_note-1"><span class="corchete-llamada">[</span>1<span class="corchete-llamada">]</span></a></sup>​<sup id="cite_ref-2" class="reference separada"><a href="#cite_note-2"><span class="corchete-llamada">[</span>2<span class="corchete-llamada">]</span></a></sup>​</dd></dl> <p>En duck typing, el programador solo se ocupa de los aspectos del objeto que van a usarse, y no del tipo de objeto que se trata. Por ejemplo en un lenguaje sin duck-typing uno puede crear una función que toma un objeto de tipo <i>Pato</i> y llama los métodos "caminar" y "<a href="https://meta.wikimedia.org/wiki/wikt:es:parpar" class="extiw" title="m:wikt:es:parpar">parpar</a>" de ese objeto. En un lenguaje con duck-typing, la función equivalente tomaría un objeto de cualquier tipo e invocaría los métodos caminar y parpar. Si el objeto tratado no tiene los métodos pedidos, la función enviará una señal de error en tiempo de ejecución. Este hecho de que la función acepte cualquier tipo de objeto que implemente correctamente los métodos solicitados es lo que evoca la cita precedente y da nombre a la forma de tipificación. </p><p>El Duck typing usualmente es acompañado por el hábito de <i>no</i> probar el tipo de los argumentos en los métodos y funciones, y en vez de eso confiar en la buena documentación, el código claro y la prueba para asegurar el uso correcto. Los usuarios de lenguajes con tipificado estático al iniciarse con lenguajes de tipificado dinámico a menudo se ven tentados a agregar chequeos de tipo estáticos (previos a ejecución), desaprovechando la flexibilidad y beneficios del duck typing y restringiendo el dinamismo del lenguaje. </p> <meta property="mw:PageProp/toc" /> <div class="mw-heading mw-heading2"><h2 id="Ejemplos_del_concepto">Ejemplos del concepto</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Duck_typing&action=edit&section=1" title="Editar sección: Ejemplos del concepto"><span>editar</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Considera el siguiente pseudocódigo para un lenguaje con duck-typing: </p> <pre><b>función</b> calcular(a, b, c) => <b>devuelve</b> (a+b)*c ejemplo1 = calcular (1, 2, 3) ejemplo2 = calcular ([1, 2, 3], [4, 5, 6], 2) ejemplo3 = calcular ('manzanas ', 'y naranjas, ', 3) <b>mostrar</b> <b>a_cadena</b> ejemplo1 <b>mostrar</b> <b>a_cadena</b> ejemplo2 <b>mostrar</b> <b>a_cadena</b> ejemplo3 </pre> <p>En el ejemplo, cada vez que se llama la función <code>calcular</code> se pueden emplear objetos sin relación de herencia (números, listas y cadenas). En tanto y en cuanto los objetos soporten los métodos "+" y "*" la operación tendrá éxito. Si se traduce este algoritmo a <a href="/wiki/Ruby" title="Ruby">Ruby</a> o <a href="/wiki/Python" title="Python">Python</a> por ejemplo, el resultado de la ejecución será: </p> <pre>9 [1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6] manzanas y naranjas, manzanas y naranjas, manzanas y naranjas, </pre> <p>Así, el duck typing permite <a href="/wiki/Polimorfismo_(inform%C3%A1tica)" title="Polimorfismo (informática)">polimorfismo</a> sin <a href="/wiki/Herencia_(inform%C3%A1tica)" title="Herencia (informática)">herencia</a>. El único requerimiento de la función <code>calcular</code> para las variables es que soporten los métodos "+" y "*". </p><p>La prueba del pato puede verse en el siguiente ejemplo (en Python). Hasta donde a la función <code>en_el_bosque</code> le importa, el objeto es un pato: </p> <div class="mw-highlight mw-highlight-lang-python mw-content-ltr" dir="ltr"><pre><span></span><span class="k">class</span> <span class="nc">Pato</span><span class="p">:</span> <span class="k">def</span> <span class="nf">parpar</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="nb">print</span> <span class="s2">"Cuac!"</span> <span class="k">def</span> <span class="nf">plumas</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="nb">print</span> <span class="s2">"El pato tiene plumas blancas y grises."</span> <span class="k">class</span> <span class="nc">Persona</span><span class="p">:</span> <span class="k">def</span> <span class="nf">parpar</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="nb">print</span> <span class="s2">"La persona imita el sonido de un pato."</span> <span class="k">def</span> <span class="nf">plumas</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> <span class="nb">print</span> <span class="s2">"La persona toma una pluma del suelo y la muestra."</span> <span class="k">def</span> <span class="nf">en_el_bosque</span><span class="p">(</span><span class="n">pato</span><span class="p">):</span> <span class="n">pato</span><span class="o">.</span><span class="n">parpar</span><span class="p">()</span> <span class="n">pato</span><span class="o">.</span><span class="n">plumas</span><span class="p">()</span> <span class="k">def</span> <span class="nf">juego</span><span class="p">():</span> <span class="n">donald</span> <span class="o">=</span> <span class="n">Pato</span><span class="p">()</span> <span class="n">juan</span> <span class="o">=</span> <span class="n">Persona</span><span class="p">()</span> <span class="n">en_el_bosque</span><span class="p">(</span><span class="n">donald</span><span class="p">)</span> <span class="n">en_el_bosque</span><span class="p">(</span><span class="n">juan</span><span class="p">)</span> <span class="n">juego</span><span class="p">()</span> </pre></div> <div class="mw-heading mw-heading2"><h2 id="Duck_typing_en_lenguajes_de_tipificación_estática"><span id="Duck_typing_en_lenguajes_de_tipificaci.C3.B3n_est.C3.A1tica"></span>Duck typing en lenguajes de tipificación estática</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Duck_typing&action=edit&section=2" title="Editar sección: Duck typing en lenguajes de tipificación estática"><span>editar</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Ciertos lenguajes que usualmente son de tipificación estática como <a href="/wiki/Boo_(programaci%C3%B3n)" class="mw-redirect" title="Boo (programación)">Boo</a> y la versión 4 de <a href="/wiki/C_Sharp" title="C Sharp">C#</a> tienen anotaciones extra de tipos<sup id="cite_ref-3" class="reference separada"><a href="#cite_note-3"><span class="corchete-llamada">[</span>3<span class="corchete-llamada">]</span></a></sup>​<sup id="cite_ref-4" class="reference separada"><a href="#cite_note-4"><span class="corchete-llamada">[</span>4<span class="corchete-llamada">]</span></a></sup>​ que instruyen al compilador para que disponga el chequeo de tipo de las clases en tiempo de ejecución y no en tiempo de compilación, y que incluya código de chequeo de tipos en tiempo de ejecución en la salida compilada. Estos agregados permiten al lenguaje gozar de la mayor parte de los beneficios del duck-typing con la única desventaja de tener que identificar y especificar qué clases serán dinámicas en tiempo de compilación. </p> <div class="mw-heading mw-heading2"><h2 id="Comparación_con_otros_tipos_de_tipificación"><span id="Comparaci.C3.B3n_con_otros_tipos_de_tipificaci.C3.B3n"></span>Comparación con otros tipos de tipificación</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Duck_typing&action=edit&section=3" title="Editar sección: Comparación con otros tipos de tipificación"><span>editar</span></a><span class="mw-editsection-bracket">]</span></span></div> <div class="mw-heading mw-heading3"><h3 id="Sistemas_de_tipificación_estructural"><span id="Sistemas_de_tipificaci.C3.B3n_estructural"></span>Sistemas de tipificación estructural</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Duck_typing&action=edit&section=4" title="Editar sección: Sistemas de tipificación estructural"><span>editar</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>El duck typing es similar pero diferente a la <a href="/w/index.php?title=Tipificaci%C3%B3n_estructural&action=edit&redlink=1" class="new" title="Tipificación estructural (aún no redactado)">tipificación estructural</a>. La tipificación estructural es un sistema de tipificación estática que determina la compatibilidad y la equivalencia de tipos según su estructura, mientras que el duck typing es dinámico y determina dicha compatibilidad basándose en la parte de la estructura que se accede en tiempo de ejecución.<br />El lenguaje de programación <a href="/w/index.php?title=Ocaml&action=edit&redlink=1" class="new" title="Ocaml (aún no redactado)">Objective Caml</a> usa un sistema de tipificación estructural. </p> <div class="mw-heading mw-heading3"><h3 id="Interfaces">Interfaces</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Duck_typing&action=edit&section=5" title="Editar sección: Interfaces"><span>editar</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Las <a href="/wiki/Interfaz_(Java)" title="Interfaz (Java)">interfaces</a> pueden proveer algunos de los beneficios del duck typing pero este es diferente en cuanto no se define explícitamente una interfaz. Por ejemplo, si una librería Java de terceros implementa una clase que no es posible modificar, no se podrá usar una instancia de esa clase en lugar de una interfaz definida por uno mismo, mientras que el duck typing sí permite hacerlo. </p> <div class="mw-heading mw-heading3"><h3 id="Templates_o_tipos_genéricos"><span id="Templates_o_tipos_gen.C3.A9ricos"></span>Templates o tipos genéricos</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Duck_typing&action=edit&section=6" title="Editar sección: Templates o tipos genéricos"><span>editar</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Los <a href="/wiki/Template" class="mw-redirect" title="Template">Template</a>, funciones o métodos genéricos aplican la prueba del pato en un contexto de tipificación estática; esto reúne todas las ventajas y desventajas de la tipificación estática contra la tipificación dinámica en general. El duck typing puede también ser más flexible en que <i>solo los métodos llamados en tiempo de ejecución necesitan ser implementados</i>, mientras que los <i>templates</i> <i>requieren que se implemente todos los métodos que no deban resultar inaccesibles en tiempo de <a href="/wiki/Compilaci%C3%B3n" class="mw-redirect" title="Compilación">compilación</a></i>. </p><p>Puede mencionarse como ejemplos los lenguajes C++ y D con templates, que derivaron de los genéricos de <a href="/wiki/Ada_(lenguaje_de_programaci%C3%B3n)" title="Ada (lenguaje de programación)">Ada</a>. </p> <div class="mw-heading mw-heading2"><h2 id="Críticas"><span id="Cr.C3.ADticas"></span>Críticas</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Duck_typing&action=edit&section=7" title="Editar sección: Críticas"><span>editar</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Una crítica citada a menudo dice: </p> <dl><dd>Un problema con el duck typing es que fuerza al programador a tener un entendimiento mucho más amplio del código con que está trabajando en todo momento. En un lenguaje con tipificación estática y fuerte que use controles de tipo en jerarquías y parámetros, es mucho más difícil pasarle un tipo inesperado de objeto a una clase. Por ejemplo en Python podrías fácilmente crear una clase llamada Vino, que espera una clase que implemente el atributo "prensa" como un ingrediente. Sin embargo una clase llamada Imprenta podría también implementar un método llamado prensa(). Con duck typing, para poder prevenir errores extraños y difíciles de detectar el desarrollador debe ser consciente de cada uso potencial del método "prensa", aunque esté conceptualmente desvinculado del tema con que esté trabajando.</dd></dl> <dl><dd>Esencialmente, el problema es que "si camina como pato y se oye como pato", podría ser un dragón haciendo el pato. No siempre querrás dejar los dragones en el estanque, aunque sepan hacerse pasar por patos.</dd></dl> <p>Los defensores del duck typing como <a href="/wiki/Guido_van_Rossum" title="Guido van Rossum">Guido van Rossum</a> argumentan que el asunto se maneja con pruebas, y con el conocimiento del código necesario para mantenerlo.<sup id="cite_ref-5" class="reference separada"><a href="#cite_note-5"><span class="corchete-llamada">[</span>5<span class="corchete-llamada">]</span></a></sup>​<sup id="cite_ref-6" class="reference separada"><a href="#cite_note-6"><span class="corchete-llamada">[</span>6<span class="corchete-llamada">]</span></a></sup>​ </p><p>Las críticas acerca del duck typing tienden a ser casos especiales de aspectos más amplios relacionados con la disputa entre la tipificación estática y la dinámica. </p> <div class="mw-heading mw-heading2"><h2 id="Historia">Historia</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Duck_typing&action=edit&section=8" title="Editar sección: Historia"><span>editar</span></a><span class="mw-editsection-bracket">]</span></span></div> <p><a href="/wiki/Alex_Martelli" title="Alex Martelli">Alex Martelli</a> hizo uso precoz (2000) del término en un <a rel="nofollow" class="external text" href="https://groups.google.com/group/comp.lang.python/msg/e230ca916be58835?hl=en&">mensaje</a> del grupo de noticias comp.lang.python. También resaltó la malinterpretación de la prueba literal del pato, lo que podría indicar que el término ya era usado. </p> <dl><dd><i>En otras palabras, no chequeen si ES un pato, chequeen si PARPA como pato, CAMINA como pato, etc, etc, dependiendo de exactamente qué parte de la conducta de un pato necesitan para jugar su juego de lenguaje..</i></dd></dl> <div class="mw-heading mw-heading2"><h2 id="Implementaciones">Implementaciones</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Duck_typing&action=edit&section=9" title="Editar sección: Implementaciones"><span>editar</span></a><span class="mw-editsection-bracket">]</span></span></div> <div class="mw-heading mw-heading3"><h3 id="En_C#"><span id="En_C.23"></span>En C#</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Duck_typing&action=edit&section=10" title="Editar sección: En C#"><span>editar</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>En C# 4.0 el compilador y la ejecución colaboran para implementar <a href="/w/index.php?title=C_Sharp_4.0&action=edit&redlink=1" class="new" title="C Sharp 4.0 (aún no redactado)">dynamic member lookup</a>. </p> <div class="mw-highlight mw-highlight-lang-csharp mw-content-ltr" dir="ltr"><pre><span></span><span class="k">namespace</span><span class="w"> </span><span class="nn">DuckTyping</span> <span class="p">{</span> <span class="w"> </span><span class="k">using</span><span class="w"> </span><span class="nn">System</span><span class="p">;</span> <span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Pato</span> <span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Parpar</span><span class="p">()</span> <span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">"Quaaaaaack!"</span><span class="p">);</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Plumas</span><span class="p">()</span> <span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">"El pato tiene plumas blancas y grises."</span><span class="p">);</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Persona</span> <span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Parpar</span><span class="p">()</span> <span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">"La persona imita a un pato."</span><span class="p">);</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="k">public</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Plumas</span><span class="p">()</span> <span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">Console</span><span class="p">.</span><span class="n">WriteLine</span><span class="p">(</span><span class="s">"La persona toma una pluma del piso y la muestra."</span><span class="p">);</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="k">internal</span><span class="w"> </span><span class="k">class</span><span class="w"> </span><span class="nc">Program</span> <span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">EnElBosque</span><span class="p">(</span><span class="kt">dynamic</span><span class="w"> </span><span class="n">pato</span><span class="p">)</span> <span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">pato</span><span class="p">.</span><span class="n">Parpar</span><span class="p">();</span> <span class="w"> </span><span class="n">pato</span><span class="p">.</span><span class="n">Plumas</span><span class="p">();</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Juego</span><span class="p">()</span> <span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="kt">dynamic</span><span class="w"> </span><span class="n">donald</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Pato</span><span class="p">();</span> <span class="w"> </span><span class="kt">dynamic</span><span class="w"> </span><span class="n">juan</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Persona</span><span class="p">();</span> <span class="w"> </span><span class="n">EnElBosque</span><span class="p">(</span><span class="n">donald</span><span class="p">);</span> <span class="w"> </span><span class="n">EnElBosque</span><span class="p">(</span><span class="n">juan</span><span class="p">);</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="k">private</span><span class="w"> </span><span class="k">static</span><span class="w"> </span><span class="k">void</span><span class="w"> </span><span class="nf">Main</span><span class="p">()</span> <span class="w"> </span><span class="p">{</span> <span class="w"> </span><span class="n">Juego</span><span class="p">();</span> <span class="w"> </span><span class="p">}</span> <span class="w"> </span><span class="p">}</span> <span class="p">}</span> </pre></div> <div class="mw-heading mw-heading3"><h3 id="En_ColdFusion">En ColdFusion</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Duck_typing&action=edit&section=11" title="Editar sección: En ColdFusion"><span>editar</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>El lenguaje de scripting para desarrollo de aplicaciones web <a href="/wiki/ColdFusion" title="ColdFusion">ColdFusion</a> permite que los argumentos de las funciones sean de tipo <i>any</i> (cualquiera). Para este tipo de argumento, puede pasarse un tipo arbitrario de objeto y las llamadas a métodos son entabladas en tiempo de ejecución. Si un objeto no implementa un método solicitado, se arroja una excepción en tiempo de ejecución que puede ser capturada y manejada adecuadamente. En ColdFusion 8, esta circunstancia se puede capturar con el evento onMissingMethod() en vez de con un manejador de excepciones. Un tipo alternativo de argumento <i>WEB-INF.cftags.component</i> restringe el tipo de objeto solo a componentes ColdFusion (CFC) lo cual permite un mejor manejo de mensajes de error cuando se pasan elementos que no sean objetos. </p> <div class="mw-heading mw-heading3"><h3 id="En_Common_Lisp">En Common Lisp</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Duck_typing&action=edit&section=12" title="Editar sección: En Common Lisp"><span>editar</span></a><span class="mw-editsection-bracket">]</span></span></div> <p><a href="/wiki/Common_Lisp" title="Common Lisp">Common Lisp</a> provee una extensión orientada a objetos (<a href="/wiki/Common_Lisp_Object_System" title="Common Lisp Object System">Common Lisp Object System</a>, abreviado CLOS). La combinación de CLOS y la tipificación dinámica de Lisp hacen del duck typing un estilo de programación habitual en Common Lisp. </p><p>Con Common Lisp uno tampoco necesita averiguar los tipos, porque en la ejecución se obtendrá una señal de error en caso de que una función no sea aplicable. El error puede manejarse con el Sistema de Condiciones de Common Lisp. Los métodos se definen fuera de las clases y también pueden definirse para objetos específicos. </p> <div class="mw-highlight mw-highlight-lang-lisp mw-content-ltr" dir="ltr"><pre><span></span><span class="p">(</span><span class="nb">defclass</span><span class="w"> </span><span class="nv">duck</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">())</span> <span class="p">(</span><span class="nb">defmethod</span><span class="w"> </span><span class="nv">quack</span><span class="w"> </span><span class="p">((</span><span class="nv">a-duck</span><span class="w"> </span><span class="nv">duck</span><span class="p">))</span> <span class="w"> </span><span class="p">(</span><span class="nb">print</span><span class="w"> </span><span class="s">"Quaaaaaack!"</span><span class="p">))</span> <span class="p">(</span><span class="nb">defmethod</span><span class="w"> </span><span class="nv">feathers</span><span class="w"> </span><span class="p">((</span><span class="nv">a-duck</span><span class="w"> </span><span class="nv">duck</span><span class="p">))</span> <span class="w"> </span><span class="p">(</span><span class="nb">print</span><span class="w"> </span><span class="s">"The duck has white and gray feathers."</span><span class="p">))</span> <span class="p">(</span><span class="nb">defclass</span><span class="w"> </span><span class="nv">person</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">())</span> <span class="p">(</span><span class="nb">defmethod</span><span class="w"> </span><span class="nv">quack</span><span class="w"> </span><span class="p">((</span><span class="nv">a-person</span><span class="w"> </span><span class="nv">person</span><span class="p">))</span> <span class="w"> </span><span class="p">(</span><span class="nb">print</span><span class="w"> </span><span class="s">"The person imitates a duck."</span><span class="p">))</span> <span class="p">(</span><span class="nb">defmethod</span><span class="w"> </span><span class="nv">feathers</span><span class="w"> </span><span class="p">((</span><span class="nv">a-person</span><span class="w"> </span><span class="nv">person</span><span class="p">))</span> <span class="w"> </span><span class="p">(</span><span class="nb">print</span><span class="w"> </span><span class="s">"The person takes a feather from the ground and shows it."</span><span class="p">))</span> <span class="p">(</span><span class="nb">defmethod</span><span class="w"> </span><span class="nv">in-the-forest</span><span class="w"> </span><span class="p">(</span><span class="nv">duck</span><span class="p">)</span> <span class="w"> </span><span class="p">(</span><span class="nv">quack</span><span class="w"> </span><span class="nv">duck</span><span class="p">)</span> <span class="w"> </span><span class="p">(</span><span class="nv">feathers</span><span class="w"> </span><span class="nv">duck</span><span class="p">))</span> <span class="p">(</span><span class="nb">defmethod</span><span class="w"> </span><span class="nv">game</span><span class="w"> </span><span class="p">()</span> <span class="w"> </span><span class="p">(</span><span class="k">let</span><span class="w"> </span><span class="p">((</span><span class="nv">donald</span><span class="w"> </span><span class="p">(</span><span class="nb">make-instance</span><span class="w"> </span><span class="ss">'duck</span><span class="p">))</span> <span class="w"> </span><span class="p">(</span><span class="nv">john</span><span class="w"> </span><span class="p">(</span><span class="nb">make-instance</span><span class="w"> </span><span class="ss">'person</span><span class="p">)))</span> <span class="w"> </span><span class="p">(</span><span class="nv">in-the-forest</span><span class="w"> </span><span class="nv">donald</span><span class="p">)</span> <span class="w"> </span><span class="p">(</span><span class="nv">in-the-forest</span><span class="w"> </span><span class="nv">john</span><span class="p">)))</span> <span class="p">(</span><span class="nv">game</span><span class="p">)</span> </pre></div> <p>El estilo usual de desarrollo en Common Lisp (usando un Lisp <a href="/wiki/REPL" title="REPL">REPL</a> como <a href="/w/index.php?title=SLIME&action=edit&redlink=1" class="new" title="SLIME (aún no redactado)">SLIME</a>) permite también la reparación interactiva: </p> <div class="mw-highlight mw-highlight-lang-lisp mw-content-ltr" dir="ltr"><pre><span></span><span class="nv">?</span><span class="w"> </span><span class="p">(</span><span class="nb">defclass</span><span class="w"> </span><span class="nv">cat</span><span class="w"> </span><span class="p">()</span><span class="w"> </span><span class="p">())</span> <span class="err">#</span><span class="nv"><STANDARD-CLASS</span><span class="w"> </span><span class="nv">CAT></span> <span class="nv">?</span><span class="w"> </span><span class="p">(</span><span class="nv">quack</span><span class="w"> </span><span class="p">(</span><span class="nb">make-instance</span><span class="w"> </span><span class="ss">'cat</span><span class="p">))</span> <span class="nb">></span><span class="w"> </span><span class="nv">Error:</span><span class="w"> </span><span class="nv">There</span><span class="w"> </span><span class="nv">is</span><span class="w"> </span><span class="nv">no</span><span class="w"> </span><span class="nv">applicable</span><span class="w"> </span><span class="nc">method</span><span class="w"> </span><span class="nv">for</span><span class="w"> </span><span class="k">the</span><span class="w"> </span><span class="nv">generic</span><span class="w"> </span><span class="nv">function:</span> <span class="nb">></span><span class="w"> </span><span class="err">#</span><span class="nv"><STANDARD-GENERIC-FUNCTION</span><span class="w"> </span><span class="nv">QUACK</span><span class="w"> </span><span class="mh">#x300041C2371F</span><span class="nb">></span> <span class="nb">></span><span class="w"> </span><span class="nb">when</span><span class="w"> </span><span class="nv">called</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="nv">arguments:</span> <span class="nb">></span><span class="w"> </span><span class="p">(</span><span class="err">#</span><span class="nv"><CAT</span><span class="w"> </span><span class="mh">#x300041C7EEFD</span><span class="nb">></span><span class="p">)</span> <span class="nb">></span><span class="w"> </span><span class="nv">If</span><span class="w"> </span><span class="nv">continued:</span><span class="w"> </span><span class="nv">Try</span><span class="w"> </span><span class="nv">calling</span><span class="w"> </span><span class="nv">it</span><span class="w"> </span><span class="nv">again</span> <span class="mi">1</span><span class="w"> </span><span class="nb">></span><span class="w"> </span><span class="p">(</span><span class="nb">defmethod</span><span class="w"> </span><span class="nv">quack</span><span class="w"> </span><span class="p">((</span><span class="nv">a-cat</span><span class="w"> </span><span class="nv">cat</span><span class="p">))</span> <span class="w"> </span><span class="p">(</span><span class="nb">print</span><span class="w"> </span><span class="s">"The cat imitates a duck."</span><span class="p">))</span> <span class="err">#</span><span class="nv"><STANDARD-METHOD</span><span class="w"> </span><span class="nv">QUACK</span><span class="w"> </span><span class="p">(</span><span class="nv">CAT</span><span class="p">)</span><span class="nb">></span> <span class="mi">1</span><span class="w"> </span><span class="nb">></span><span class="w"> </span><span class="p">(</span><span class="nb">continue</span><span class="p">)</span> <span class="s">"The cat imitates a duck."</span> </pre></div> <p>De este modo se puede desarrollar el software extendiendo código duck-typed que funciona parcialmente. </p> <div class="mw-heading mw-heading3"><h3 id="En_Objective-C">En Objective-C</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Duck_typing&action=edit&section=13" title="Editar sección: En Objective-C"><span>editar</span></a><span class="mw-editsection-bracket">]</span></span></div> <p><a href="/wiki/Objective-C" title="Objective-C">Objective-C</a>, un híbrido entre C y Smalltalk, permite declarar objetos de tipo 'id' y enviarles cualquier mensaje, como en SmallTalk. Quien envía puede probar un objeto para ver si ha respondido al mensaje, el objeto puede decidir al recibir el mensaje si responderá al mensaje o no, y si el remitente envía un mensaje al que el receptor no puede responder, se arroja una excepción. Así, duck typing es completamente soportado en Objective-C. </p> <div class="mw-heading mw-heading3"><h3 id="En_Python">En Python</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Duck_typing&action=edit&section=14" title="Editar sección: En Python"><span>editar</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>El duck typing se usa intensivamente en <a href="/wiki/Python" title="Python">Python</a>. El <a rel="nofollow" class="external text" href="https://docs.python.org/glossary.html#term-duck-typing">Glosario de Python</a> define el duck typing como sigue: </p> <style data-mw-deduplicate="TemplateStyles:r161259348">.mw-parser-output .flexquote{display:flex;flex-direction:column;background-color:var(--background-color-neutral-subtle);color:var(--color-base);border-left:3px solid var(--border-color-base);font-size:90%;margin:1em 4em;padding:.4em .8em}.mw-parser-output .flexquote>.flex{display:flex;flex-direction:row}.mw-parser-output .flexquote>.flex>.quote{width:100%}.mw-parser-output .flexquote>.flex>.separator{border-left:1px solid var(--border-color-divider);border-top:1px solid var(--border-color-divider);margin:.4em .8em}.mw-parser-output .flexquote>.cite{text-align:right}@media all and (max-width:600px){.mw-parser-output .flexquote>.flex{flex-direction:column}}</style> <blockquote class="flexquote"> <div class="flex"> <div class="quote">Estilo de programación Python que determina el tipo de un objeto a través de la inspección de sus métodos o su conjunto de atributos en lugar de emplear la relación con algún tipo de objeto ("Si luce como un pato y suena como un pato, debe ser un pato") Enfatizando las interfaces sobre los tipos específicos, el código bien diseñado mejora su flexibilidad al permitir sustitución polimórfica. El duck typing evita las pruebas con <code>type()</code> o <code>isinstance()</code>. En lugar de eso, prefiere el estilo de programación "Es más fácil pedir perdón que pedir permiso".</div> </div> </blockquote> <p>El ejemplo estándar de duck typing en Python son las clases que se asimilan a archivos. Estas clases pueden implementar algunos o todos los métodos de <code>archivo</code> y pueden usarse donde normalmente se usaría <code>archivo</code>. Por ejemplo, <a rel="nofollow" class="external text" href="https://docs.python.org/library/gzip.html#gzip.GzipFile"><code>GzipFile</code></a> implementa un objeto similar a un archivo para acceder a datos comprimidos con el algoritmo <a href="/wiki/Gzip" title="Gzip">gzip</a>. <a rel="nofollow" class="external text" href="https://web.archive.org/web/20090725113548/http://docs.python.org/library/stringio.html#module-cStringIO"><code>cStringIO</code></a> permite tratar una cadena como un archivo. Los sockets y los archivos también comparten muchos atributos. Sin embargo, los sockets no disponen del método <a rel="nofollow" class="external text" href="https://web.archive.org/web/20090218182621/http://diveintopython.org/http_web_services/gzip_compression.html#d0e29389"><code>tell()</code></a> y no pueden usarse dondequiera que puede usarse <code>GzipFile</code>. Esto demuestra la flexibilidad del duck typing: un objeto que se asemeja a un archivo implementa solo los métodos que puede, y consecuentemente solo puede usarse donde tiene sentido hacerlo. </p><p>El principio de "es más fácil pedir perdón que pedir permiso" describe el uso del manejo de excepciones. Por ejemplo en vez de ver si un objeto que supuestamente se asemeja al objeto Pato usado en el ejemplo precedente tiene o no el método <i>parpar()</i> (usando <code>if hasattr(<a href="/wiki/Azulon" class="mw-redirect" title="Azulon">azulon</a>, "parpar"): ...</code> es preferible rodear el intento de parpar con un manejo de excepciones: </p> <div class="mw-highlight mw-highlight-lang-python mw-content-ltr" dir="ltr"><pre><span></span><span class="k">try</span><span class="p">:</span> <span class="n">azulon</span><span class="o">.</span><span class="n">parpar</span><span class="p">()</span> <span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">TypeError</span><span class="p">):</span> <span class="nb">print</span> <span class="s2">"el azulón no puede parpar()"</span> </pre></div> <p>Las ventajas de esta forma de trabajo son que favorece el manejo estructurado de otras clases de errores (así, por ejemplo, una subclase de Pato mudo podría arrojar una excepción de tipo CuacException que podría agregarse al manejador sin ahondar mucho en la lógica del código, y manejar situaciones en que diferentes clases de objetos pudieran tener colisiones de nombres por miembros incompatibles (si tuviésemos una persona de apellido Azulón con un atributo lógico "parpa=True"; un intento de ejecutar Azulón.parpar() arrojaría un TypeError)). </p><p>Volviendo al campo de los ejemplos más prácticos que implementan conductas similares a las de un archivo, es preferible generalmente emplear las herramientas de tratamiento de excepciones de Python para manejar la amplia variedad de errores de E/S que pueden ocurrir debido a numerosos problemas ambientales y de sistema operativo que escapan al control del programador. Aquí nuevamente las excepciones de "duck typing" pueden ser atrapadas junto a las de SO, E/S u otros posibles errores sin complicados chequeos ni lógicas de comprobación de errores. </p> <div class="mw-heading mw-heading3"><h3 id="En_Julia">En Julia</h3><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Duck_typing&action=edit&section=15" title="Editar sección: En Julia"><span>editar</span></a><span class="mw-editsection-bracket">]</span></span></div> <p><a href="/wiki/Julia_(lenguaje_de_programaci%C3%B3n)" title="Julia (lenguaje de programación)">Julia</a> usa <a href="/w/index.php?title=Despacho_m%C3%BAltiple&action=edit&redlink=1" class="new" title="Despacho múltiple (aún no redactado)">despacho múltiple</a>, <a href="/w/index.php?title=Funciones_gen%C3%A9ricas&action=edit&redlink=1" class="new" title="Funciones genéricas (aún no redactado)">funciones genéricas</a>, <a href="/wiki/Signatura_(inform%C3%A1tica)" title="Signatura (informática)">anotaciones de tipos</a> opcionales e <a href="/wiki/Inferencia_de_tipos" title="Inferencia de tipos">inferencia de tipos</a> automática por defecto, el tipo <code>Any</code> es el super-tipo de toda la jerarquía, ejemplo en el <b>REPL</b> (bucle de lectura-evaluación-impresión) interactivo de Julia: </p> <div class="mw-highlight mw-highlight-lang-julia mw-content-ltr" dir="ltr"><pre><span></span><span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">Pato</span><span class="w"> </span><span class="k">end</span> <span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="n">type</span><span class="w"> </span><span class="n">Persona</span> <span class="w"> </span><span class="n">nombre</span><span class="o">::</span><span class="kt">ASCIIString</span> <span class="w"> </span><span class="k">end</span> <span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="n">parpar</span><span class="p">(</span><span class="n">x</span><span class="o">::</span><span class="kt">Pato</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">println</span><span class="p">(</span><span class="s">"Cuaaac!"</span><span class="p">)</span> <span class="n">parpar</span><span class="w"> </span><span class="p">(</span><span class="n">generic</span><span class="w"> </span><span class="k">function</span><span class="w"> </span><span class="n">with</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">method</span><span class="p">)</span> <span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="n">parpar</span><span class="p">(</span><span class="n">x</span><span class="o">::</span><span class="kt">Persona</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">println</span><span class="p">(</span><span class="s">"La persona imita el sonido de un pato."</span><span class="p">)</span> <span class="n">parpar</span><span class="w"> </span><span class="p">(</span><span class="n">generic</span><span class="w"> </span><span class="k">function</span><span class="w"> </span><span class="n">with</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="n">methods</span><span class="p">)</span> <span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="n">plumas</span><span class="p">(</span><span class="n">x</span><span class="o">::</span><span class="kt">Pato</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">println</span><span class="p">(</span><span class="s">"El pato tiene plumas blancas y grises."</span><span class="p">)</span> <span class="n">plumas</span><span class="w"> </span><span class="p">(</span><span class="n">generic</span><span class="w"> </span><span class="k">function</span><span class="w"> </span><span class="n">with</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">method</span><span class="p">)</span> <span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="n">plumas</span><span class="p">(</span><span class="n">x</span><span class="o">::</span><span class="kt">Persona</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">println</span><span class="p">(</span><span class="s">"La persona toma una pluma del suelo y la muestra."</span><span class="p">)</span> <span class="n">plumas</span><span class="w"> </span><span class="p">(</span><span class="n">generic</span><span class="w"> </span><span class="k">function</span><span class="w"> </span><span class="n">with</span><span class="w"> </span><span class="mi">2</span><span class="w"> </span><span class="n">methods</span><span class="p">)</span> <span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="n">nombre</span><span class="p">(</span><span class="n">x</span><span class="o">::</span><span class="kt">Persona</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">println</span><span class="p">(</span><span class="n">x</span><span class="o">.</span><span class="n">nombre</span><span class="p">)</span> <span class="n">nombre</span><span class="w"> </span><span class="p">(</span><span class="n">generic</span><span class="w"> </span><span class="k">function</span><span class="w"> </span><span class="n">with</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">method</span><span class="p">)</span> <span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="k">function</span><span class="w"> </span><span class="n">en_el_bosque</span><span class="p">(</span><span class="n">pato</span><span class="p">)</span><span class="w"> </span><span class="c"># lo mismo que pato::Any</span> <span class="w"> </span><span class="n">parpar</span><span class="p">(</span><span class="n">pato</span><span class="p">)</span> <span class="w"> </span><span class="n">plumas</span><span class="p">(</span><span class="n">pato</span><span class="p">)</span> <span class="w"> </span><span class="k">end</span> <span class="n">en_el_bosque</span><span class="w"> </span><span class="p">(</span><span class="n">generic</span><span class="w"> </span><span class="k">function</span><span class="w"> </span><span class="n">with</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">method</span><span class="p">)</span> <span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="k">function</span><span class="w"> </span><span class="n">juego</span><span class="p">()</span> <span class="w"> </span><span class="n">donald</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Pato</span><span class="p">()</span> <span class="w"> </span><span class="n">juan</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Persona</span><span class="p">(</span><span class="s">"Juan"</span><span class="p">)</span> <span class="w"> </span><span class="n">en_el_bosque</span><span class="p">(</span><span class="n">donald</span><span class="p">)</span> <span class="w"> </span><span class="n">en_el_bosque</span><span class="p">(</span><span class="n">juan</span><span class="p">)</span> <span class="w"> </span><span class="k">end</span> <span class="n">juego</span><span class="w"> </span><span class="p">(</span><span class="n">generic</span><span class="w"> </span><span class="k">function</span><span class="w"> </span><span class="n">with</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="n">method</span><span class="p">)</span> <span class="n">julia</span><span class="o">></span><span class="w"> </span><span class="n">juego</span><span class="p">()</span> <span class="n">Cuaaac!</span> <span class="n">El</span><span class="w"> </span><span class="n">pato</span><span class="w"> </span><span class="n">tiene</span><span class="w"> </span><span class="n">plumas</span><span class="w"> </span><span class="n">blancas</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">grises</span><span class="o">.</span> <span class="n">La</span><span class="w"> </span><span class="n">persona</span><span class="w"> </span><span class="n">imita</span><span class="w"> </span><span class="n">el</span><span class="w"> </span><span class="n">sonido</span><span class="w"> </span><span class="n">de</span><span class="w"> </span><span class="n">un</span><span class="w"> </span><span class="n">pato</span><span class="o">.</span> <span class="n">La</span><span class="w"> </span><span class="n">persona</span><span class="w"> </span><span class="n">toma</span><span class="w"> </span><span class="n">una</span><span class="w"> </span><span class="n">pluma</span><span class="w"> </span><span class="n">del</span><span class="w"> </span><span class="n">suelo</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="n">la</span><span class="w"> </span><span class="n">muestra</span><span class="o">.</span> <span class="n">julia</span><span class="o">></span> </pre></div> <div class="mw-heading mw-heading2"><h2 id="Referencias">Referencias</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Duck_typing&action=edit&section=16" title="Editar sección: Referencias"><span>editar</span></a><span class="mw-editsection-bracket">]</span></span></div> <div class="listaref" style="list-style-type: decimal;"><ol class="references"> <li id="cite_note-1"><span class="mw-cite-backlink"><a href="#cite_ref-1">↑</a></span> <span class="reference-text"><span id="CITAREFDavis" class="citation libro">Davis, Robin S. <a rel="nofollow" class="external text" href="http://books.google.com/books?id=PEoti64PICIC&pg=PA7&dq=%22James+Whitcomb+Riley%22+%22when+I+see+a+bird+that+walks+like+a+duck+and+swims+%22&ei=JsHcSejCBoToM7SKge0O"><i>Who's Sitting on Your Nest Egg?</i></a>. p. 7.</span><span title="ctx_ver=Z39.88-2004&rfr_id=info%3Asid%2Fes.wikipedia.org%3ADuck+typing&rft.au=Davis%2C+Robin+S.&rft.aufirst=Robin+S.&rft.aulast=Davis&rft.btitle=Who%27s+Sitting+on+Your+Nest+Egg%3F&rft.genre=book&rft.pages=7&rft_id=http%3A%2F%2Fbooks.google.com%2Fbooks%3Fid%3DPEoti64PICIC%26pg%3DPA7%26dq%3D%2522James%2BWhitcomb%2BRiley%2522%2B%2522when%2BI%2Bsee%2Ba%2Bbird%2Bthat%2Bwalks%2Blike%2Ba%2Bduck%2Band%2Bswims%2B%2522%26ei%3DJsHcSejCBoToM7SKge0O&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook" class="Z3988"><span style="display:none;"> </span></span></span> </li> <li id="cite_note-2"><span class="mw-cite-backlink"><a href="#cite_ref-2">↑</a></span> <span class="reference-text"><span id="CITAREFHeim" class="citation libro">Heim, Michael. <a rel="nofollow" class="external text" href="http://books.google.com/books?id=j7zds6xx7S0C&pg=PA68&dq=%22james+Riley%22+OR+%22James+Whitcomb+Riley%22+bird++duck&num=100&ei=BsPcSYWoHJCmNfG7tM4O"><i>Exploring Indiana Highways</i></a>. p. 68.</span><span title="ctx_ver=Z39.88-2004&rfr_id=info%3Asid%2Fes.wikipedia.org%3ADuck+typing&rft.au=Heim%2C+Michael&rft.aufirst=Michael&rft.aulast=Heim&rft.btitle=Exploring+Indiana+Highways&rft.genre=book&rft.pages=68&rft_id=http%3A%2F%2Fbooks.google.com%2Fbooks%3Fid%3Dj7zds6xx7S0C%26pg%3DPA68%26dq%3D%2522james%2BRiley%2522%2BOR%2B%2522James%2BWhitcomb%2BRiley%2522%2Bbird%2B%2Bduck%26num%3D100%26ei%3DBsPcSYWoHJCmNfG7tM4O&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook" class="Z3988"><span style="display:none;"> </span></span></span> </li> <li id="cite_note-3"><span class="mw-cite-backlink"><a href="#cite_ref-3">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://boo.codehaus.org/Duck+Typing">Boo: Duck Typing</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20081006075246/http://boo.codehaus.org/Duck+Typing">Archivado</a> el 6 de octubre de 2008 en <a href="/wiki/Wayback_Machine" title="Wayback Machine">Wayback Machine</a>.</span> </li> <li id="cite_note-4"><span class="mw-cite-backlink"><a href="#cite_ref-4">↑</a></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://blogs.msdn.com/ericwhite/archive/2008/10/29/anders-hejlsberg-introduces-c-4-0-at-pdc-2008.aspx">Anders Hejlsberg Introduces C# 4.0 at PDC 2008</a></span> </li> <li id="cite_note-5"><span class="mw-cite-backlink"><a href="#cite_ref-5">↑</a></span> <span class="reference-text"><span id="CITAREFBruce_Eckel" class="citation web">Bruce Eckel. <a rel="nofollow" class="external text" href="https://docs.google.com/View?id=dcsvntt2_25wpjvbbhk">«Strong Typing vs. Strong Testing»</a>. mindview.</span><span title="ctx_ver=Z39.88-2004&rfr_id=info%3Asid%2Fes.wikipedia.org%3ADuck+typing&rft.au=Bruce+Eckel&rft.aulast=Bruce+Eckel&rft.btitle=Strong+Typing+vs.+Strong+Testing&rft.genre=book&rft.pub=mindview&rft_id=http%3A%2F%2Fdocs.google.com%2FView%3Fid%3Ddcsvntt2_25wpjvbbhk&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook" class="Z3988"><span style="display:none;"> </span></span></span> </li> <li id="cite_note-6"><span class="mw-cite-backlink"><a href="#cite_ref-6">↑</a></span> <span class="reference-text"><span id="CITAREFBill_Venners" class="citation web">Bill Venners. <a rel="nofollow" class="external text" href="http://www.artima.com/intv/pycontract.html">«Contracts in Python. A Conversation with Guido van Rossum, Part IV»</a>. Artima.</span><span title="ctx_ver=Z39.88-2004&rfr_id=info%3Asid%2Fes.wikipedia.org%3ADuck+typing&rft.au=Bill+Venners&rft.aulast=Bill+Venners&rft.btitle=Contracts+in+Python.+A+Conversation+with+Guido+van+Rossum%2C+Part+IV&rft.genre=book&rft.pub=Artima&rft_id=http%3A%2F%2Fwww.artima.com%2Fintv%2Fpycontract.html&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook" class="Z3988"><span style="display:none;"> </span></span></span> </li> </ol></div> <div class="mw-heading mw-heading2"><h2 id="Enlaces_externos">Enlaces externos</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=Duck_typing&action=edit&section=17" title="Editar sección: Enlaces externos"><span>editar</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li><a rel="nofollow" class="external text" href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/78502">Duck Typing: Ruby</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20110717205311/http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/78502">Archivado</a> el 17 de julio de 2011 en <a href="/wiki/Wayback_Machine" title="Wayback Machine">Wayback Machine</a>.</li> <li><a rel="nofollow" class="external text" href="http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/100511">How to duck type? - the psychology of static typing in Ruby</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20110830132933/http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/100511">Archivado</a> el 30 de agosto de 2011 en <a href="/wiki/Wayback_Machine" title="Wayback Machine">Wayback Machine</a>.</li> <li><a rel="nofollow" class="external text" href="https://docs.python.org/glossary.html#term-duck-typing">Python documentation glossary entry on duck-typing</a></li> <li><a href="/wiki/Dr._Dobb%27s" class="mw-redirect" title="Dr. Dobb's">Dr. Dobb's</a> June 01 2005: <a rel="nofollow" class="external text" href="http://www.ddj.com/cpp/184401971">"Templates and Duck Typing"</a></li> <li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20110812110235/http://bigdingus.com/2007/12/08/just-what-is-this-javascript-object-you-handed-me/">Javascript 'typeof' limitations and duck typing</a></li> <li><a rel="nofollow" class="external text" href="http://blog.dhananjaynene.com/2008/09/python-from-java-how-duck-typing-influences-class-design-and-design-principles/">Python from a Java perspective - Part 2 - How duck typing influences class design and design principles</a> <a rel="nofollow" class="external text" href="https://web.archive.org/web/20110812143746/http://blog.dhananjaynene.com/2008/09/python-from-java-how-duck-typing-influences-class-design-and-design-principles/">Archivado</a> el 12 de agosto de 2011 en <a href="/wiki/Wayback_Machine" title="Wayback Machine">Wayback Machine</a>.</li></ul> <p><br /> </p> <style data-mw-deduplicate="TemplateStyles:r161257576">.mw-parser-output .mw-authority-control{margin-top:1.5em}.mw-parser-output .mw-authority-control .navbox table{margin:0}.mw-parser-output .mw-authority-control .navbox hr:last-child{display:none}.mw-parser-output .mw-authority-control .navbox+.mw-mf-linked-projects{display:none}.mw-parser-output .mw-authority-control .mw-mf-linked-projects{display:flex;padding:0.5em;border:1px solid var(--border-color-base,#a2a9b1);background-color:var(--background-color-neutral,#eaecf0);color:var(--color-base,#202122)}.mw-parser-output .mw-authority-control .mw-mf-linked-projects ul li{margin-bottom:0}.mw-parser-output .mw-authority-control .navbox{border:1px solid var(--border-color-base,#a2a9b1);background-color:var(--background-color-neutral-subtle,#f8f9fa)}.mw-parser-output .mw-authority-control .navbox-list{border-color:#f8f9fa}.mw-parser-output .mw-authority-control .navbox th{background-color:#eeeeff}html.skin-theme-clientpref-night .mw-parser-output .mw-authority-control .mw-mf-linked-projects{border:1px solid var(--border-color-base,#72777d);background-color:var(--background-color-neutral,#27292d);color:var(--color-base,#eaecf0)}html.skin-theme-clientpref-night .mw-parser-output .mw-authority-control .navbox{border:1px solid var(--border-color-base,#72777d)!important;background-color:var(--background-color-neutral-subtle,#202122)!important}html.skin-theme-clientpref-night .mw-parser-output .mw-authority-control .navbox-list{border-color:#202122!important}html.skin-theme-clientpref-night .mw-parser-output .mw-authority-control .navbox th{background-color:#27292d!important}@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .mw-authority-control .mw-mf-linked-projects{border:1px solid var(--border-color-base,#72777d)!important;background-color:var(--background-color-neutral,#27292d)!important;color:var(--color-base,#eaecf0)!important}html.skin-theme-clientpref-os .mw-parser-output .mw-authority-control .navbox{border:1px solid var(--border-color-base,#72777d)!important;background-color:var(--background-color-neutral-subtle,#202122)!important}html.skin-theme-clientpref-os .mw-parser-output .mw-authority-control .navbox-list{border-color:#202122!important}html.skin-theme-clientpref-os .mw-parser-output .mw-authority-control .navbox th{background-color:#27292d!important}}</style><div class="mw-authority-control"><div role="navigation" class="navbox" aria-label="Navbox" style="width: inherit;padding:3px"><table class="hlist navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="row" class="navbox-group" style="width: 12%; text-align:center;"><a href="/wiki/Control_de_autoridades" title="Control de autoridades">Control de autoridades</a></th><td class="navbox-list navbox-odd" style="text-align:left;border-left-width:2px;border-left-style:solid;width:100%;padding:0px"><div style="padding:0em 0.25em"> <ul><li><b>Proyectos Wikimedia</b></li> <li><span style="white-space:nowrap;"><span typeof="mw:File"><a href="/wiki/Wikidata" title="Wikidata"><img alt="Wd" src="//upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Wikidata-logo.svg/20px-Wikidata-logo.svg.png" decoding="async" width="20" height="11" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Wikidata-logo.svg/30px-Wikidata-logo.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Wikidata-logo.svg/40px-Wikidata-logo.svg.png 2x" data-file-width="1050" data-file-height="590" /></a></span> Datos:</span> <span class="uid"><a href="https://www.wikidata.org/wiki/Q374282" class="extiw" title="wikidata:Q374282">Q374282</a></span></li></ul> </div></td></tr></tbody></table></div><div class="mw-mf-linked-projects hlist"> <ul><li><span style="white-space:nowrap;"><span typeof="mw:File"><a href="/wiki/Wikidata" title="Wikidata"><img alt="Wd" src="//upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Wikidata-logo.svg/20px-Wikidata-logo.svg.png" decoding="async" width="20" height="11" class="mw-file-element" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Wikidata-logo.svg/30px-Wikidata-logo.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/f/ff/Wikidata-logo.svg/40px-Wikidata-logo.svg.png 2x" data-file-width="1050" data-file-height="590" /></a></span> Datos:</span> <span class="uid"><a href="https://www.wikidata.org/wiki/Q374282" class="extiw" title="wikidata:Q374282">Q374282</a></span></li></ul> </div></div> <!-- NewPP limit report Parsed by mw‐web.codfw.main‐84d8f4b96‐dvdxz Cached time: 20241115190739 Cache expiry: 2592000 Reduced expiry: false Complications: [show‐toc] CPU time usage: 0.177 seconds Real time usage: 0.986 seconds Preprocessor visited node count: 489/1000000 Post‐expand include size: 11200/2097152 bytes Template argument size: 1637/2097152 bytes Highest expansion depth: 8/100 Expensive parser function count: 6/500 Unstrip recursion depth: 0/20 Unstrip post‐expand size: 33796/5000000 bytes Lua time usage: 0.072/10.000 seconds Lua memory usage: 2230025/52428800 bytes Number of Wikibase entities loaded: 1/400 --> <!-- Transclusion expansion time report (%,ms,calls,template) 100.00% 530.569 1 -total 15.25% 80.909 1 Plantilla:Control_de_autoridades 9.96% 52.820 1 Plantilla:Listaref 7.21% 38.235 2 Plantilla:Cita_libro 2.10% 11.163 1 Plantilla:Cita 1.05% 5.557 2 Plantilla:Cita_web 0.65% 3.472 4 Plantilla:Wayback --> <!-- Saved in parser cache with key eswiki:pcache:idhash:3388525-0!canonical and timestamp 20241115190739 and revision id 149223263. Rendering was triggered because: page-view --> </div><!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" width="1" height="1" style="border: none; position: absolute;"></noscript> <div class="printfooter" data-nosnippet="">Obtenido de «<a dir="ltr" href="https://es.wikipedia.org/w/index.php?title=Duck_typing&oldid=149223263">https://es.wikipedia.org/w/index.php?title=Duck_typing&oldid=149223263</a>»</div></div> <div id="catlinks" class="catlinks" data-mw="interface"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/wiki/Especial:Categor%C3%ADas" title="Especial:Categorías">Categorías</a>: <ul><li><a href="/wiki/Categor%C3%ADa:Lenguajes_de_programaci%C3%B3n_orientada_a_objetos" title="Categoría:Lenguajes de programación orientada a objetos">Lenguajes de programación orientada a objetos</a></li><li><a href="/wiki/Categor%C3%ADa:Teor%C3%ADa_de_tipos" title="Categoría:Teoría de tipos">Teoría de tipos</a></li></ul></div></div> </div> </main> </div> <div class="mw-footer-container"> <footer id="footer" class="mw-footer" > <ul id="footer-info"> <li id="footer-info-lastmod"> Esta página se editó por última vez el 12 feb 2023 a las 00:49.</li> <li id="footer-info-copyright">El texto está disponible bajo la <a href="/wiki/Wikipedia:Texto_de_la_Licencia_Creative_Commons_Atribuci%C3%B3n-CompartirIgual_4.0_Internacional" title="Wikipedia:Texto de la Licencia Creative Commons Atribución-CompartirIgual 4.0 Internacional">Licencia Creative Commons Atribución-CompartirIgual 4.0</a>; pueden aplicarse cláusulas adicionales. Al usar este sitio aceptas nuestros <a class="external text" href="https://foundation.wikimedia.org/wiki/Policy:Terms_of_Use/es">términos de uso</a> y nuestra <a class="external text" href="https://foundation.wikimedia.org/wiki/Policy:Privacy_policy/es">política de privacidad</a>.<br />Wikipedia® es una marca registrada de la <a rel="nofollow" class="external text" href="https://wikimediafoundation.org/es/">Fundación Wikimedia</a>, una organización sin ánimo de lucro.</li> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy/es">Política de privacidad</a></li> <li id="footer-places-about"><a href="/wiki/Wikipedia:Acerca_de">Acerca de Wikipedia</a></li> <li id="footer-places-disclaimers"><a href="/wiki/Wikipedia:Limitaci%C3%B3n_general_de_responsabilidad">Limitación de responsabilidad</a></li> <li id="footer-places-wm-codeofconduct"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Universal_Code_of_Conduct">Código de conducta</a></li> <li id="footer-places-developers"><a href="https://developer.wikimedia.org">Desarrolladores</a></li> <li id="footer-places-statslink"><a href="https://stats.wikimedia.org/#/es.wikipedia.org">Estadísticas</a></li> <li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement/es">Declaración de cookies</a></li> <li id="footer-places-mobileview"><a href="//es.m.wikipedia.org/w/index.php?title=Duck_typing&mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Versión para móviles</a></li> </ul> <ul id="footer-icons" class="noprint"> <li id="footer-copyrightico"><a href="https://wikimediafoundation.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/static/images/footer/wikimedia-button.svg" width="84" height="29" alt="Wikimedia Foundation" loading="lazy"></a></li> <li id="footer-poweredbyico"><a href="https://www.mediawiki.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/w/resources/assets/poweredby_mediawiki.svg" alt="Powered by MediaWiki" width="88" height="31" loading="lazy"></a></li> </ul> </footer> </div> </div> </div> <div class="vector-settings" id="p-dock-bottom"> <ul></ul> </div><script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgHostname":"mw-web.codfw.main-f69cdc8f6-szq4t","wgBackendResponseTime":171,"wgPageParseReport":{"limitreport":{"cputime":"0.177","walltime":"0.986","ppvisitednodes":{"value":489,"limit":1000000},"postexpandincludesize":{"value":11200,"limit":2097152},"templateargumentsize":{"value":1637,"limit":2097152},"expansiondepth":{"value":8,"limit":100},"expensivefunctioncount":{"value":6,"limit":500},"unstrip-depth":{"value":0,"limit":20},"unstrip-size":{"value":33796,"limit":5000000},"entityaccesscount":{"value":1,"limit":400},"timingprofile":["100.00% 530.569 1 -total"," 15.25% 80.909 1 Plantilla:Control_de_autoridades"," 9.96% 52.820 1 Plantilla:Listaref"," 7.21% 38.235 2 Plantilla:Cita_libro"," 2.10% 11.163 1 Plantilla:Cita"," 1.05% 5.557 2 Plantilla:Cita_web"," 0.65% 3.472 4 Plantilla:Wayback"]},"scribunto":{"limitreport-timeusage":{"value":"0.072","limit":"10.000"},"limitreport-memusage":{"value":2230025,"limit":52428800}},"cachereport":{"origin":"mw-web.codfw.main-84d8f4b96-dvdxz","timestamp":"20241115190739","ttl":2592000,"transientcontent":false}}});});</script> <script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"Article","name":"Duck typing","url":"https:\/\/es.wikipedia.org\/wiki\/Duck_typing","sameAs":"http:\/\/www.wikidata.org\/entity\/Q374282","mainEntity":"http:\/\/www.wikidata.org\/entity\/Q374282","author":{"@type":"Organization","name":"Colaboradores de los proyectos Wikimedia"},"publisher":{"@type":"Organization","name":"Wikimedia Foundation, Inc.","logo":{"@type":"ImageObject","url":"https:\/\/www.wikimedia.org\/static\/images\/wmf-hor-googpub.png"}},"datePublished":"2010-02-19T23:15:29Z","dateModified":"2023-02-12T00:49:23Z"}</script> </body> </html>