No, to je pravda. Me slo spis o to, ze uz musite rict "trida ta a ta ma ty a ty metody", a tim padem jste castecne nominativni. Pritom by mohlo docela dobre strukturalne platit, ze nejaka metoda tridy zavisi na jinych metodach te tridy, takze by nebyl duvod neimplementovat tuto metodu ve vsech tridach, ktere implementuji predpoklady teto metody.
Asi jde o urcity druh dalsi urovne strukturalniho typovani, podobne jako jsou generika dalsi urovni nominativniho typovani. (A jsou s tim take spojene dalsi problemy, tezko rict, zda se to vubec vyplati resit.)
Ale tohle všechny duck typing jazyky také řeší, jen jinak. Vezmete nějaký existující objekt (třeba medvěda), přidáte mu metodu pro kvákání a hned máte medvědokachnu. Pak samozřejmě lze implementovat i tovární objekty, které vytváří jiné objekty podle zadání (tak jsou implementovány třídy v Pythonu). Tyto dvě vlastnosti můžete libovolně kombinovat, takže klidně můžete vytvořit továrnu, která nechá jinou továrnu vytvořit objekt a pokud ten objekt má určité metody, tak je použije v přidané („virtuální“) metodě, a pokud je nemá, tak to implementuje jinak (nebo neimplementuje vůbec, jak chcete), v Pythonu by to bylo třeba takto:
class Kure:
def kvakni(self):
print 'Pip'
class Medved:
def __init__(self, name='grizzly'):
self.name = name
def tovarnaNaKachny(tovarna, *params, **kwparams):
import new
objekt = tovarna(*params, **kwparams)
if hasattr(objekt, 'kvakni'):
def kvakej(self):
for i in xrange(5):
self.kvakni()
objekt.kvakej = new.instancemethod(kvakej, objekt, type(objekt))
else:
def kvakej(self):
for i in xrange(5):
print 'Kvak'
objekt.kvakej = new.instancemethod(kvakej, objekt, type(objekt))
return objekt
kachnokure = tovarnaNaKachny(Kure)
kachnomedved = tovarnaNaKachny(Medved, name='brtnik')
kachnokure.kvakej()
kachnomedved.kvakej()