0

たとえば、私はこのコードを持っています:

abstract class A {
  def functionA() {
    val a : A = null; // take null just for temporary, because I cannot think what should to put here
    a.functionB
  }

  def functionB() {
      print("hello")
  }
}

class C extends A{
}

object Main extends App {
  val c : C = new C()
  c.functionB // print hello
  c.functionA // ERROR
}

functionA、次の場合にオブジェクトを宣言したい: 現在のクラスが C の場合、a は型 C を持ちます。現在のクラスが D の場合、a は型 D を持ちます。できないため:

val a : A = new A // because A is abstract

Java ではこれを簡単に実行できますが、Scala ではそのようなことはできません。これを助けてください。

ありがとう :)

4

1 に答える 1

1

ケースでオブジェクトを宣言したい:現在のクラスがCの場合、aの型はCです。現在のクラスがDの場合、aの型はDです

私の理解が正しければ、単純な継承ポリモーフィズムについて話しているのです。thisあなたの場合、値への参照を割り当てるaか、直接使用することができます:

abstract class A {
  def functionA {
    this.functionB
  }

  def functionB {
    print("hello")
  }
}

class C extends A{
}

object Main extends App {
  val c : C = new C()
  c.functionB
  c.functionA
}

この場合、 はありませんNullPointerException

ただし、基本クラス内に実際の型の新しいオブジェクトを本当に作成したい場合は、継承ポリモーフィズムを別の方法で使用する必要があります (これは @brunoconde が提案したものよりもやや単純だと思いますが、考え方は非常に似ています。私はしません)ここではジェネリックが本当に必要だと思います):

abstract class A {
  def functionA {
    val a : A = create()
    a.functionB
  }

  def functionB {
    print("hello")
  }

  def create(): A
}

class C extends A {
  override def create() = new C
}

これは、必要に応じて Java で行うことです。create()ただし、すべての子クラスでメソッドをオーバーライドする必要があります。リフレクションに頼らずに、オーバーライドせずにこれを行うことができるとは思えません。

于 2012-10-10T12:48:20.767 に答える