4

ここにあるものがあります:私はいくつかの基本的なクラスを持っています、例えば:

abstract class Car(private val model: String = "no name")

そして、クラスを拡張したいのですがCar、たとえば、次のようになります。

class Mazda(model: String) extends Car(model)

私の質問は:そのような与えられたモデルなしでマツダインスタンスを作成する方法:new Mazdaそして名前のオブジェクトを持っていますno nameか?

4

5 に答える 5

5

目標を達成するには、サブクラスでデフォルトを定義する必要があります。

class Mazda(model: String = "no name") extends Car(model)
于 2012-12-05T21:17:30.693 に答える
1

ヤクシェーバーの回答を受け入れていないこともあり、あなたの質問はまだ完全には回答されていないと思います。その答えは、これを行うことを示唆しています:

abstract class Car(private val model: String = "no name")
class Mazda(model: String = "no name") extends Car(model)

このシナリオでは、呼び出すとnew Mazda、必要な結果が得られます。しかし、魔法の文字列"no name"が 2 つの異なる場所で発生するため、完全に満足できるものではありません。Carコンストラクター内から引数なしでコンストラクターを呼び出す方法を考え出すことができればと思うかもしれMazdaません。おそらく次のようなものです。

// does not compile!
class Mazda(model: String) extends Car(model) {
    def this() { super() } // attempt at an auxiliary constructor
}

残念ながら、補助コンストラクターは最終的にクラスのプライマリ コンストラクターを直接的または間接的に呼び出す必要があります。modelしたがって、場合によっては a の構築のためにを指定できるようにしたい場合、引数なしMazdaでコンストラクターを呼び出す方法はありません。Car

魔法の文字列の重複を避けたい場合は、"no name"どこかの定数に引き抜くのが最善の方法です。たとえば、次のようにします。

object Car {
  val DefaultCarModel = "no name"
}
abstract class Car(private val model: String = DefaultCarModel)
class Mazda(model: String = DefaultCarModel) extends Car(model)
于 2015-09-11T14:30:27.573 に答える
0

名前のないものを拡張するのはどうですか?

trait DefaultNameIsNoName extends Car {
  override name = "no name"
}

class Fiat extends Car with DefaultNameIsNoName

または、継承できる名前のない別のクラスを用意します。

class NoNameCar extends Car with DefaultNameIsNoName

class Packard extends NoNameCar

しかし、モデル名のない車を持っているとはどういう意味ですか? 本当に本物をモデル化していますか?

于 2012-12-06T01:17:45.727 に答える
0

私はそれが不可能だと感じており、その理由を次のように説明しようとしています。

  1. Mazda基本的に、スーパークラスコンストラクターを別の方法で呼び出すための補助コンストラクターが必要です
  2. 補助コンストラクターは最終的に、スーパークラス コンストラクターが呼び出されるデフォルトのコンストラクターを呼び出します。
  3. スーパークラス コンストラクターは、既定のコンストラクターで 1 つの形式でのみ表示されます。(?)

C++ などの一部の言語では、コンストラクターが互いに独立しており、そこでスーパークラス コンストラクターを呼び出すため、必要なものが得られます。Java では、依存型と独立型の両方の方法を実行できます。ただし、サブクラスごとに補助コンストラクターを作成する必要があり、これはさらに手間がかかります。

于 2012-12-05T21:56:06.500 に答える
0

これがあなたが望むものかどうかはわかりませんが、

abstract class Car(private val model: String = "no name")
class Mazda extends Car

マツダを簡単に作成できるようになりました

val car = new Mazda

モデルの値は"no name"

于 2012-12-05T21:56:58.747 に答える