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.