コード:
object Link {
//TYPE-1 (purely functional)
def apply(name: String, target: Page, f: () => Unit, isExclusive: Boolean) = new Link(name, target, f, isExclusive)
//..
//TYPE-2 (purely side-effect)
def apply(source: Page, target: Page, f: () => Unit, isExclusive: Boolean): Link = {
val link = Link("LINK [" + source.getName + "]->[" + target.getName + "]", target, f, isExclusive)
source += link
link
}
//type-2 too
def apply(source: Page, target: Page, isExclusive: Boolean): Link = Link (source, target, () => Unit, isExclusive)
}
説明:apply
メソッドには 2 つのタイプがあります。タイプ 1 は単純にコンパニオン クラス コンストラクターが返すものを返し、タイプ 2 は何も返さず、代わりに新しいインスタンスで何かを行います。したがって、それらに対する2つの異なる引数のセット。ただし、アンダースコアでマークされている2 番目のタイプ 2 適用メソッドでエラーが発生します (投稿の下部を参照) 。_Link_
def apply(source: Page, target: Page, isExclusive: Boolean): Link = _Link_ (source, target, () => Unit, isExclusive)
最初のタイプ 2 適用メソッドはいくつかの仕事を行い、2 番目 (および 3 番目と 4 番目...) のタイプ 2 適用メソッドでは、そこに書かれていることを複製するのではなく、最初のものを参照したいだけです。ただし、Scala-IDE では、type-1 のすべての適用メソッドがコメント化されていない限り、これを行うことはできません。Scala-IDE が署名の中で迷子になり、私の明白な意図が見えないようです。それとも私は何か間違ったことをしていますか?
エラー: 2 番目のapply
方法では、次のようなエラーが表示されます。
オーバーロードされたメソッド値は代替手段で適用されます: (ソース: org.app.Page,ターゲット: org.app.Page,f: () => Unit,isExclusive: Boolean)org.app.meta.Link < and> (name: String ,target: org.app.Page,f: () => Unit,isExclusive: Boolean)org.app.meta.Link は適用できません (org.app.Page, org.app.Page, () => Unit .type、ブール値)
アップデート
タイプ 1 の apply メソッドは、タイプ 2 の最初のメソッドから問題なく呼び出されることに注意してください。