从父类返回泛型类型的序列

时间:2015-01-24 04:24:45

标签: class generics nim

在下面的示例中,我有一个Foo对象,其中包含通用Tfoo字段{。}}。

T是可继承的,并且有一个名为Foo的proc,它应该创建并返回由子类定义的类型test的序列。

在我的代码的最新版本中,T proc的第一行出现错误:

  

无法实例化:'T'


如果我删除test类型并将其替换为S,则错误会消失,但我会在FooP行上收到错误消息:

  

类型不匹配:得到(BarP)


以下是代码:

discard b.test()

我确定我刚搞砸了。有人可以告诉我在这种情况下type Foo[T] = object {.inheritable.} foo:T FooP[T] = ref Foo[T] proc test[S, T](self: S): seq[T] = var f: T = self.foo var s: seq[T] = @[f] s type Bar = object of Foo[int] BarP = ref Bar var b: BarP = new(Bar) discard x.test() 如何成功返回由子类定义的test()类型的序列?

1 个答案:

答案 0 :(得分:1)

泛型不起作用的继承是一个已知错误:https://github.com/nim-lang/Nim/issues/88

您可以通过不指定类型来解决此问题,例如在test3中:

type
  Foo[T] = object {.inheritable.}
    foo: T
  FooP[T] = ref Foo[T]

# Only works for Foo[T]
proc test[T](self: Foo[T]): seq[T] =
  @[self.foo]

# Only works for ref Foo[T]
proc test2[T](self: FooP[T]): seq[T] =
  @[self.foo]

# Workaround:
proc test3(self): auto =
  @[self.foo]

type
  Bar = object of Foo[int]
  BarP = ref Bar

var a = new Foo[int]
var b: BarP = new(Bar)
var c: Bar

echo a.test3()
echo b.test3()
echo c.test3()