This works type SNodeAny = ref object of RootObj SNode[T] = ref object of SNodeAny DNode[T] = ref object method newDNode(s: SNodeAny) {.base.} = echo "newDNode base" method newDNode[T](s: SNode[T]) = echo "newDNode generic" method getStr(s: SNode[float]): string {.base.} = "blahblah" let s = SNodeAny(SNode[float]()) newDnode(s) Run
why? The instantiation `SNode[float]` is cached and by that time there are no methods attached to `SNode` yet. Then the cache is consulted and the instantation of `method newDNode[T](s: SNode[T])` is skipped. Multi methods and generics are broken beyond repair IMO.