2014-10-28 79 views
1

在Scala中是有可能在基类声明泛型抽象函数,然后 提供各种派生类不同的具体实施方式是这样的:部分定义

abstract class B { 

    def foo[T,V](u:T):V 
} 

class D extends B { 

    def foo(u:T_0) = {...} 
    def foo(u:T_1) = {...} 
    .... 
} 

,同样也指类D1 ,D2,...从类B(具有可能不同的具体类型T_j) 到类D_j以便使用obj.foo(u)和编译器标志,只要foo用于某个类型的参数,而foo不是定义。

总之,问题是:是否从B派生的类被视为混凝土,只要foo被定义为 至少有一个具体类型T?

回答

2

在你的例子中,你不能在D范围内专用UT,你必须匹配来自基类的参数。您也不能在子类中提供个别特殊情况下的重写,例如部分函数 - 具体类必须为每个抽象方法提供实现,并覆盖所有参数。

在我看来,像你真正想要的是在类级别类型参数,对B本身,使派生类专业的参数,然后它们继承相应地变得专业的foo方法的接口。所以,你想要做的事,如:

abstract class B[T, V] { 
    def foo(u: T): V 
} 

class D extends B[String, Int] { 
    def foo(u: String): Int = u.length 
} 

(您也可以发现它有用添加注解方差class B[-T, +V],但这是另一个故事。)

+0

确定。谢谢。这很不幸。 – 2014-10-28 13:23:01

+0

为什么不幸?以这种方式使用类型系统的整个想法是能够对方法调用的有效性进行严格的编译时检查。取决于你想要完成什么,可能有其他更精细的方法。有各种各样的方法可以将'foo'中的类型关联起来。我想你可能不得不问一个新的,更具体的问题来获得帮助。 – acjay 2014-10-28 15:25:52