对象可以在scala中扩展抽象类吗?

Posted

技术标签:

【中文标题】对象可以在scala中扩展抽象类吗?【英文标题】:Can an object extend abstract class in scala? 【发布时间】:2017-01-30 01:02:48 【问题描述】:

我是 scala 的新手。我正在尝试创建一个扩展抽象类的对象,如下所示

object Conversions extends UnitConversions

 override def inchesToCentimeters(inches:Int) = inches * 2.5
 override def gallonsToLiters(gallons:Int) = gallons * 3.78
 override def milesToKilometers(miles:Int) = miles * 1.6


abstract class UnitConversions

 def inchesToCentimeters(inches:Int)
 def gallonsToLiters(gallons:Int)
 def milesToKilometers(miles:Int)

当我尝试访问对象的成员函数时,我得到 () 这个表达式作为输出。

Conversions.milesToKilometers(20) //I get output ()

下面的说法是否有效???

var ucv:UnitConversions = new Conversions
println(ucv.milesToKilometers(3)) // I get output () here as well

提前致谢!

【问题讨论】:

【参考方案1】:

您需要为函数提供返回类型,否则它们返回Unit

abstract class UnitConversions 
  def inchesToCentimeters(inches:Int): Double
  def gallonsToLiters(gallons:Int): Double
  def milesToKilometers(miles:Int): Double

【讨论】:

如何协调You need to provide a return type for the functions 与:abstract class F def f = 42 ,然后:(new F ).f 返回:res0: Int = 42 ` 在这种情况下,返回类型是从实现中推断出来的。如果您的抽象类不提供默认实现或返回类型,则假定它是Unit 函数。 谢谢 - abstract class G def g 。然后,class GImpl extends G override def g: Int = 42 编译失败:error: overriding method g in class G of type => Unit;。任何编译器标志,或者,我推测,scala 票要求此类方法的返回类型? 编译器标志是 -Xfuture -deprecation(用于警告),我个人喜欢 -Xfatal-warnings ;-) 谢谢大家。它有帮助【参考方案2】:

关于这个问题:

下面的说法是否有效???

var ucv:UnitConversions = new Conversions println(ucv.milesToKilometers(3))

这不会编译。 object 基本上表示单例,可用于“静态”方法。创建多个单例实例是没有意义的。看看这个问题:Difference between object and class in scala

【讨论】:

什么?你确定你回答的问题是正确的吗?

以上是关于对象可以在scala中扩展抽象类吗?的主要内容,如果未能解决你的问题,请参考以下文章

我们可以直接实例化一个抽象类吗? [复制]

Scala的密封抽象与抽象类

Android Studio中的View是抽象类吗?

Scala 面向接口编程

Scala 基础 :面向对象(下篇)

PHP能在类中实例化一个类吗