0

Lift MailerのXmlノードではなく、StringからHtmlメールの本文を設定したいので、Mailerをサブクラス化し、buildMailBodyメソッドを再定義しました。

class HtmlMailer extends Mailer {
  final case class HtmlMailBodyType(text: String) extends MailBodyType

  override protected def buildMailBody(tab: MailBodyType) = {
    tab match {
      case HtmlMailBodyType(text) =>
        val bp = new MimeBodyPart
        bp.setText(text, charSet, "html")
        bp
      case _ => super.buildMailBody(tab)
    }
  }
}

object HtmlMailer extends HtmlMailer

私がそれを使おうとすると:

import net.liftweb.util.Mailer
import Mailer._    

HtmlMailer.sendMail(From(sender.email), Subject(subject), To(user.email), HtmlMailBodyType(body))

コンパイルエラーが発生します:

error: type mismatch;
found   : net.liftweb.util.Mailer.From
required: com.mypackage.HtmlMailer.From
Error occurred in an application involving default arguments.
HtmlMailer.sendMail(From(sender.email), Subject(subject), To(user.email), HtmlMailBodyType(body))

なぜこれが幸せなのですか、どうすれば正しく修正できますか?

import Mailer._をimportHtmlMailer._に変更しましたが、機能しましたが、パラメータータイプが異なるため、HtmlMailer代わりに置換できないため、リスコフの置換原則に違反していると思いますか?Mailer

4

1 に答える 1

1

パスに依存する型とシングルトンに問題があります。ネストされたクラスがある場合、外部クラスの各インスタンスには、ネストされたクラスの異なるインスタンスがあります。

これで、From(plus、、SubjectなどTo)はネストされているため、特定のインスタンスに属します。この場合、それらを提供する2つのインスタンスがあります。それらはオブジェクトです

net.liftweb.util.Mailer
com.mypackage.HtmlMailer

これらはクラスではなく、オブジェクトであることに注意してください。

現在、このメソッドでは、パラメーターがそれ自体と同じインスタンスsendMailに属するクラスで構成されている必要があります。それを行わない方法があるので、そのような要件を作る理由はたくさんあります。

したがって、実際には、ここではリスコフの置換原則の違反はなく、インポートによって隠されている型の違反だけです。明示的に書き出すと、より明確になります。

val myInst: net.liftweb.util.Mailer = HtmlMailer
myInst.sendMail(myInst.From(sender.email), myInst.Subject(subject), myInst.To(user.email), myInst.HtmlMailBodyType(body))

HtmlMailerそこをnet.liftweb.util.Mailerまたはの他のインスタンスに置き換えることができnet.liftweb.util.Mailer、それは機能します。両方がまったく同じクラスであっても、の2つの異なるインスタンスを使用することはできません。net.liftweb.util.Mailer

于 2012-06-20T17:19:53.640 に答える