3

私はこのクラスをscalaで持っています

trait PageComponent {
  protected var page:Page = _
  protected var pageData:PageData = _
  def initialise(page0:Page, pageData0:PageData) {
    page = page0
    pageData = pageData0    
  }
}

PageComponentの各サブクラスには、PageおよびPageDataの独自のサブクラスもあります。サブクラスがpageまたはpageDataを呼び出すとき、このために独自のタイプを返すようにします。

私は次のようなものを試しました

trait PageComponent {
  type P <: Page
  protected var page:P = _
  protected var pageData:PageData = _
  def initialise(page0:P, pageData0:PageData) {
    page = page0
    pageData = pageData0    
  }
}

この種の動作は、サブクラスがページを呼び出し、タイプPを実装することによって定義されたページタイプを取得できるようにします。

ただし、initialiseメソッドを呼び出そうとしていて、Page型のオブジェクトを通過しているところ、このエラーが表示されています。

error: type mismatch;
found   : pageInfoToGoTo.page.type (with underlying type com.xxx.gui.Page)
required: pageComponentToGoTo.P
pageComponentToGoTo.initialise(pageInfoToGoTo.page, pageData)

私はここで明らかに間違っていますが、Pは「ページ」であるため、これでうまくいくはずだと思いました。

何か案は?

-----詳細については編集------

私は次のようなものを持っています

class AhoyPage extends Page    

object MyPageComponent extends PageComponent {
  type P = AhoyPage
}

jwinandyの回答を読んだ後、initialiseメソッドがこのように呼び出されるようにコードを変更しました

pageComponentToGoTo.initialise(pageInfoToGoTo.page.asInstanceOf[pageComponentToGoTo.P], pageData)

そしてそれは今動作します。だから私の質問は答えられたと思います。ありがとう。しかし、そのキャストはあまりいいものではありません。このようなPageInfoのリストがあります

PageInfo(page:Page, ...)

PageInfoが選択されている場合、ページを使用してマップ内のページコンポーネントを検索します。それを行うためのより良い方法があるはずですが、そうでない場合、私はこれに満足しています。

4

2 に答える 2

2

サブクラス化するときにPを定義する必要があります。

あなたの場合、あなたは持っていなければなりません:

type P = com.xxx.gui.Page

例、これは機能します:

trait Page
trait PageData

trait PageComponent {
  type P <: Page
  protected var page:P = _
  protected var pageData:PageData = _
  def initialise(page0:P, pageData0:PageData) {
    page = page0
    pageData = pageData0    
  }
}

class AhoyPage extends Page    

object MyPageComponent extends PageComponent {

    type P = AhoyPage
}

object MyApp extends App {
    MyPageComponent.initialise(new AhoyPage, new PageData {})
    // OR
    MyPageComponent.initialise(new MyPageComponent.P, new PageData {})

}

より良いレベルの構成可能性を実現するために少しリファクタリングしたい場合は、コードをもっと投稿してください。

- 編集 -

https://gist.github.com/3608684のように

于 2012-09-02T10:33:50.803 に答える
0

さて、問題はこの仮定です:

Pは「a」ページだからだと思いました

あなたはそれがであると宣言しませんでしPPage。これはあなたが宣言したものです:

type P <: Page

つまりPはのサブタイプですPage。サブタイプは現時点では不明であり、実際、ある時点で何かと等しいとinitialise宣言Pしない限り、何も渡すことはできません。

問題は、本当に必要P <: Pageですか?のすべてのサブタイプを含む、をinitialise取るとだけ言うことはできませんか?PagePage

于 2012-09-02T21:16:23.017 に答える