2016-06-20 3 views
0
trait A 
> defined trait A 

class B extends A 
> defined class B 

class C with A 
> <console>:1: error: ';' expected but 'with' found. 
    class C with A 
     ^

ただし、クラスCをAnyRefから拡張すると、最後の文が正しく機能します。クラス 'class'を拡張することなく、クラスを拡張することなく、 'with'キーワードを持つようなmix mixin

class C extends AnyRef with A 
> defined class C 

これは言語の文法に欠けていますか?または任意の特定の概念的理由?概念的にはclass B extends Aclass B with Aは異なると思います。

PS:同様の質問またはエラーを探してみました"';期待されているが、「あり」が見つかりました。。これに既に回答している場合は、重複をマークしてください。

+0

はどのように 'クラスBは異なるA'でA'と'クラスBを拡張していますか?具体的にどのような行動が違うと思いますか? – Dima

+0

抽象的な 'run'メソッドを持つ' Runnable'のような特性を考えてみましょう。クラス「TaskTemplate」からRunnable mixinまで拡張したクラス「Task」があるかもしれません。何も拡張していないが、単にRunnableとmixinする別のクラスの 'PushNotificationTask'では、PushNotificationTaskはRunnableを拡張する必要がありますが、**キーワードを使って** mixinとして拡張する必要はありません。概念的には、あるいはあなたがJavaのバックグラウンドからのものであれば、それをスーパークラスとはみなさないように、Runnable mixinを実装する必要があります。 – rajuGT

+0

はい、いくつかのクラスを拡張して形質でミックスすることはできますが、それは無関係です。問題はどのように具体的に2つのクラスを区別するかです。それぞれのクラスのうちの1つはAを拡張し、もう1つはAを追加することなく他のクラスを拡張します。 – Dima

答えて

0

scala-langフォーラムに同様の質問を発見し、私たちは、スカラ座の設計の早い段階でその規則を持っていたマーティン・オーダーズキー

によって

に答え。人々は それが混乱していることを発見した。そのため、常にextendsを使用するように変更しました。私はそれを見る 方法は次のようである:

クラスAはC {...}

とBのように分解されるべきで延びている。

クラスAはC {と< < < Bを拡張します。 ..} >>>

つまり、AはC { ...}で匿名テンプレートBを拡張するクラスです。そのテンプレートがクラスで始まるか、 という形質かどうかは関係ありません。

新しいコンベンションのもう1つの利点は、クラスが特性に変更されたときにサブクラスが影響を受けず、非常に頻繁に自然に発生する ということです。

乾杯

- マーティン

0

C extends Bを読み込むだけでなく、C extends B with AC with BがASビット奇妙な文の視点から見えている間、私はいつもBスーパータイプにではなく、基底クラスCに属することwithを理解していた。事実について

このように、匿名のクラスでは、「AでBを拡張する匿名クラス」の略であると読んでいます。

結果で

class C extends B with A私は

「とBを拡張Cという名前の新しいクラス」であると理解だから、class C extends Bは「何もないと(クラスまたは形質)Bを拡張する新しいクラスという名前のC」です。

この考え方では、class C with Bは「この文の動詞」という意味のない表現になります。

0

クラス定義の最も一般的な形態は

class c[tps] as m(ps1)…(psn) extends t (n≥0).

...

tフォーム基本クラスを定義

sc with mt1 with … with mtm { stats } // m≥0

のテンプレートであり、クラスのオブジェクトの動作と初期状態。 extend節extends sc with mt1 with … with mtmは省略することができ、その場合はscala.AnyRefを継承します。

http://www.scala-lang.org/files/archive/spec/2.11/05-classes-and-objects.html#class-definitions

関連する問題