【问题标题】:Is there a way to "program to interface" in scala有没有办法在scala中“编程接口”
【发布时间】:2018-08-17 15:28:35
【问题描述】:

有没有办法在 scala 中“编程到接口”?

我是 Scala 的新手。我在 scala 中有一个“特征”,并且许多类都扩展了该特征。我正在寻找一种如何使用接口而不是直接使用类的方法。

目前,我正在做:

val clazz = new MyClass() 

MyClass 是从 trait 扩展而来的。

我正在寻找一种将接口作为实例从工厂方法返回以生成类的方法。有什么办法吗?

【问题讨论】:

  • Scala 中的扩展转换就像在 Java 中一样。如果MyClass实现了一个特征Foobar并且你的方法有返回类型Foobar,你可以返回clazz就好了。
  • 调用 asInstanceOf[MyClass] 破坏了类型安全并破坏了“程序到接口”的目的
  • 您的问题不清楚。您正在谈论“编程到接口”,但在您的示例中,您使用 asInstanceOf 将值转换为具体的子类类型,这与编程到接口完全相反。跨度>
  • 另外,不清楚您所说的“我正在寻找一种方法将接口作为实例从工厂方法返回以生成类”。您只能从方法中返回对象。但是特征不是对象,因此您不能从工厂方法返回特征。 (好吧,您可以使用 Scala 反射 API 获取特征的反射代理并返回 that ...)

标签: scala traits


【解决方案1】:

你总是可以只请求接口的类型:

val clazz: MyInterf = new MyClass()

如果你真的想隐藏实现,一种方法是为 trait 创建一个同伴:

trait MyInterf {
  ...
}

class MyClass extends MyInterf {
  ...
}

object MyInterf {
  def create: MyIntef = new MyClass()
}

// calling code
val impl = MyInterf.create

【讨论】:

  • 如果我有2个类实现了这个接口,如何根据需求改变create方法返回正确的实例?我正在尝试了解如何实现 facetory mathods
  • 基于什么要求?如果只是在创建期间,您可以将参数传递给create 方法。除了创建之外,如果您的调用代码需要知道提供实现的类是什么,那么您并不是真正“为接口编程”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-05
  • 2015-09-25
  • 1970-01-01
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 2012-10-13
相关资源
最近更新 更多