2016-09-07 51 views
0

我正在使用Web服務器來處理註冊表單並將其保存到數據存儲區。我希望這是一個圖書館,並與註冊表格的不同實例一起工作。如何在scala特徵之間要求相同的參數類型?

我有以下幾點:

trait RegistrationForm 

case class SimpleRegistrationForm(name: String, 
            email: String, 
            username: String, 
            password: String) extends RegistrationForm 

我想要的RegistrationForm任何子類是可以接受的,以我的服務器。

我有以下特點:

/** 
    * Interface for saving to a datastore 
    */ 
trait RegistrationDataStore[T <: RegistrationForm] { 
    def save(form: T): Either[DataStoreException, String] 
} 


/** 
    * Trait to handle the form. 
    */ 
trait RegistrationService[T <: RegistrationForm] { 
    def handleForm(form: T): Either[AkkaHttpExtensionsException, String] 
} 

和實施:

class RegistrationServiceImpl[T <: RegistrationForm](
    registrationDataStore: RegistrationDataStore[T]) 
    extends RegistrationService[T] { 

    def handleForm(form: T): Either[AkkaHttpExtensionsException, String] = { 

    registrationDataStore.save(form) 
    } 

我的服務器基本上是這樣的:

object Server { 
     ... 
     val registrationService = new RegistrationServiceImpl[SimpleRegistrationForm](
new RegistrationMockDataStore[SimpleRegistrationForm]()) 
     ... 
} 

我怎麼能要求相同的形式子類作爲類型參數傳遞給RegistrationService和的實現?目前,他們都不會接受RegistrationForm的獨立子類(我無法測試,因爲它尚未編譯)?例如。以下是否有效?如果是,我該如何預防?

val registrationService = new RegistrationServiceImpl[SimpleRegistrationForm](
    new RegistrationMockDataStore[SomeOtherRegistrationForm]()) 

我怎麼能強制編譯器,以確保他們的RegistrationForm相同子?

回答

0

不,它將無效。您的構造函數參數是registrationDataStore: RegistrationDataStore[T],因此當您編寫new RegistrationServiceImpl[SimpleRegistrationForm](something)時,something必須是RegistrationDataStore[SimpleRegistrationForm]

相關問題