Scala - 扩展vs

时间:2016-12-08 03:14:17

标签: scala

我很困惑。在我现有的项目中,我无法找到extendswith之间的区别。你能帮我吗?

3 个答案:

答案 0 :(得分:21)

如果要继承多个class es或trait,则第一个始终为extends,以及> = 0 class / {{1成为trait的。

但请记住,您只能继承< = 1(抽象)类,这意味着如果您需要继承父类(with),它应该始终首先出现Parent形式,并且不能再将类继承到派生类。

... extends Parent ...

trait T1 trait T2 class P1 class P2 class C1 extends T1 class C2 extends T1 with T2 class C3 extends T2 with T1 class C4 extends P1 with T1 /// class C5 extends T1 with P1 // invalid /// class C6 extends P1 with P2 // invalid 实际上绑定到with ed的类/特征,例如,extend读取class C7 extends P1 with T1 with T2

请注意,这只是从 语法 的角度来看, 语义 的差异可以从如下:

  1. 使用class C7 extends (P1 with T1 with T2)和(traitabstracthere;
  2. 决议规则就是所谓的 class linearization;有a post about it

答案 1 :(得分:12)

在Scala中,您可以继承class es(具体或abstract)和trait。类似于如何只扩展一个类,但在Java中实现尽可能多的接口,您只能从一个class继承,但是只允许trait。 1}} s,因为你喜欢。

如果您要延长class,该课程应立即遵循extends关键字。您要延伸的任何trait都应该跟随,由with个关键字分隔。

如果您没有扩展课程,可以将trait放在extends关键字之后,然后继续。

就像在Java中一样,每个类都是Object的子类,无论是否显式声明它,Scala extends AnyRef with ScalaObject中的每个(用户定义的)类是否明确包含它。 / p>

因此,以下几组声明是等效的:

class MyClass { ... }
class MyClass extends AnyRef with ScalaObject { ... }

class MyClass extends MySuperClass { ... }
class MyClass extends MySuperClass with ScalaObject { ... }

class MyClass extends MyTrait1 with MyTrait2 { ... }
class MyClass extends AnyRef with MyTrait1 with MyTrait2 { ... }

class MyClass extends MySuperClass with MyTrait1 with MyTrait2 { ... }

如果您更改MySuperClassMyTrait1MyTrait2的顺序,那么最后一个示例就不一样了。特别是,如果它们都具有相同方法的实现,则不能在类的前面放置特征,并且堆栈特征的顺序很重要。 (在这种情况下,最后一个"胜出"。)

另请注意,Scala中只有class es可以包含参数,因此您只能在extends关键字之后将参数附加到该类型,从不会将参数附加到任何类型在with之后列出。

希望有所帮助!

答案 2 :(得分:8)

您继承的第一件事可以是使用SetConsoleCtrlHandler()关键字的特质或类。

$table.Rows[0].Value

您可以使用extends关键字定义更多继承的特征(仅限特征)。

trait SomeTrait
class SomeClass

class ThisIsValid extends SomeTrait
class ThisAsWell extends SomeClass

如果特质继承自某个类,则无法像上例中那样使用它。

关于withclass AlsoThisWorks extends SomeClass with SomeTrait 关键字的问题。如果您想了解有关classestraits的更多信息,请参阅官方文档。