我很困惑。在我现有的项目中,我无法找到extends
和with
之间的区别。你能帮我吗?
答案 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
。
请注意,这只是从 语法 的角度来看, 语义 的差异可以从如下:
class C7 extends (P1 with T1 with T2)
和(trait
)abstract
是
here; 答案 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 { ... }
如果您更改MySuperClass
,MyTrait1
和MyTrait2
的顺序,那么最后一个示例就不一样了。特别是,如果它们都具有相同方法的实现,则不能在类的前面放置特征,并且堆栈特征的顺序很重要。 (在这种情况下,最后一个"胜出"。)
另请注意,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
如果特质继承自某个类,则无法像上例中那样使用它。
关于with
和class AlsoThisWorks extends SomeClass with SomeTrait
关键字的问题。如果您想了解有关classes和traits的更多信息,请参阅官方文档。