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
的相同子?