2012-06-20 1 views
0

서브 클래스 매개 변수 컴파일 오류 클래스, 그래서 나는 우편물을 서브 클래스 및 buildMailBody 방법을 재정의 :스칼라 내부의 경우 내가 문자열, 리프트 메일러에 대한 XML이 아닌 노드에서 HTML 이메일의 본문을 설정할

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)) 

왜이 시간입니다 호소하고 어떻게 올바르게 고칠 수 있습니까?

나는 HtmlMailer._를 가져 오기 Mailer._을 변경하며 일을하지만, 서로 다른 매개 변수 유형을 가지고 있기 때문에 내가 Mailer 대신 HtmlMailer를 대체 할 수는, Liskov 대체 원칙을 나누기 믿지?

답변

1

경로 종속 유형과 싱글 톤에 문제가 있습니다. 중첩 클래스가있을 때 외부 클래스의 인스턴스 각각은 중첩 클래스의 인스턴스를 갖습니다.

이제 From (더하기 Subject, To 등)은 중첩되어 있기 때문에 특정 인스턴스에 속합니다. 이 경우 두 개의 인스턴스가 제공됩니다. 그들은 객체 다음과 같습니다 이러한 클래스이 아니라는 것을

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

주, 그들은 객체입니다.

이제 sendMail 메서드는과 동일한 인스턴스 에 속한 클래스로 매개 변수를 구성해야합니다. 이러한 요구 사항을 만드는 데에는 여러 가지 이유가 있습니다.

사실, 여기에는 liskov 대체 원칙이 위배되지 않습니다. 수입에 의해 숨겨진 유형의 위반 일뿐입니다. 당신이 명시 적으로 쓰는 경우 명확하게 : 당신은 net.liftweb.util.Mailer 또는 net.liftweb.util.Mailer의 다른 인스턴스가 HtmlMailer을 대체 할 수 있으며이 작동

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

. 두 개의 서로 다른 인스턴스 인 net.liftweb.util.Mailer을 사용할 수 없습니다.