Je mi fakt líto, blizbozzi, že pokračuju v této off topic diskusi, nicméně Vaše základní nepochopení principu polymorfismu mě nenechává chladným a horší je, že pomocí Internetu se podobné bludy často šíří jako lavina. Základní nepochopení na Vaší straně je v tom CO nabývá různého tvaru v polymorfismu. Tím je abstrakce (rozhraní) a nikoliv konkrétní objekt. V jazycích typu Java je polymorfismu dosahováno pomocí hierarchie (podtyp) nebo pomocí implementace rozhraní coby speciální jazykové konstrukce. To ale není jediná možnost, jak dosáhnout polymorfismu. K nastudování doporučuji například následující článek:
http://en.wikipedia.org/wiki/Duck_typing, který ukazuje, jakým způsobem je možné v některých jazycích dosáhnout polymorfismu bez explicitní deklarace implementovaného společného rozhraní v dané třídě. To společné rozhraní tam prostě implementováno je. V následujícím odkazu je ukázáno, jak je něco podobného možné udělat ve staticky typované Scale:
http://markthomas.info/blog/?p=66 (IMO daleko lepší možnost, než použití
dynamic v C#).
Teď zpátky k Vašemu nešťastnému příkladu:
var list = new List<object>() { new Type1(), new Type2() };
Tady se žádný polymorfismus nepoužívá (skutečnost, že do seznamu je možné vložit instance tříd Type1 a Type2 je dána dědičností). Ukázkou polymorfismu by bylo, kdybyste procházel vytvořený seznam instancí potomků třídy
object a volal některou z metod společného rozhraní, které objekty zdědily v rámci třídní hierarchie. V případě, že by třída
object nedefinovala žádné metody, nebylo by možné polymorfismus demonstrovat vůbec.
Další problém Vašeho svérázného chápání slova polymorfismus je v představě, že objekty mění svůj tvar tím, že je dosadíme do proměnné nadřazeného typu. Nikoliv, objekt tvar nemění, zůstává úplně stejný, jako vždycky byl a jako vždycky bude. Mění se pouze způsob, jakým na daný objekt nazíráme, přesněji řečeno dochází k zúžení (slovy iwtu osekání) našeho náhledu na daný objekt, které může být samoúčelné nebo může sloužit právě k tomu, abychom mohli využít polymorfismu způsobem, jakým to dovolují Java a spol. V Pythonu a v dalších dynamických jazycích se nic podobného používat nemusí a přesto je možné pracovat s polymorfismem (viz první odkaz).