2015-09-02 2 views
0

Я пытаюсь написать репозитария черту, как:Черта метод со свободными параметрами

trait Repository[E <: Entity] { 
    def exists(id: Long): Boolean 
    def get(id: Long): E 
    def insert(entity: E): Unit 
    def delete(entity: E): Unit 
} 

Проблема с этим кодом является то, что юридическое лицо может иметь составной ключ, который не долго, так что у меня есть проблемы с выполнением контракт с целью при внедрении репозиториев.

Я попытался представить ключ как реализацию другого признака, но я не могу выполнить контракт из-за того, что свойство репозитория не может обрабатывать конкретную реализацию каждого объекта.

Могу ли я установить параметры существует и стать свободным? могу ли я указать тип функций, которые зависят от типа ключа объекта?

+1

насчет добавления другого параметра типа в '' Repository' для Long'? Или абстрактный псевдоним. –

ответ

3

Вы можете попытаться представить составной ключ как кортеж.

trait Repository[E <: Entity, K] { 
    def exists(id: K): Boolean 
    def get(id: K): E 
    def insert(entity: E): Unit 
    def delete(entity: E): Unit 
} 

Где объект под названием Вещь, ключ которой был составной струны и длинный, будет:

class ThingRepository extends Repository[Thing, (String, Long)] { 
    def exists(id: (String, Long)): Boolean = ??? 
    def get(id: (String, Long)): Thing = ??? 
    def insert(entity: Thing): Unit = ??? 
    def delete(entity: Thing): Unit = ??? 
} 
+0

Это работает отлично. Я думаю, что было бы лучше, если бы вы могли делегировать ответственность за ключ сущности (Entity [K]), а затем получить тип ключа в репозитории. – Miguel

+0

лучшее, что вы можете сделать (насколько мне известно), обеспечивает правильность, т. Е. 'trait Repository [K, E <: Entity [K]]' –

-1

Просто из верхней части моего ума, вы можете использовать Любой вместо Long, а затем вы можете использовать случай матч, чтобы преобразовать его обратно в тип вам нужно.

Следующий код компилируется и должен работать, но я еще не пробовал его.

trait Repository[E <: Entity] { 
    def exists(id: Any): Boolean 
    def get(id: Any): E 
    def insert(entity: E): Unit 
    def delete(entity: E): Unit 
} 

case class SimpleRepository(user: User) extends Repository[User] { 

    def exists(id: Any) = { 
     id match { 
     case key: Long => user.id.equals(key) 
     case (key: Long, key2: String) => 
      user.id.equals(key) && user.name.equals(key2) 
     case _ => false 
     } 
    } 

    def get(id: Any) = { 
     id match { 
     case key:Long => user 
     case _ => user 
     } 
    } 

    def insert(entity: User) = { 

    } 

    def delete(entity: User) = { 

    } 

} 

Не уверен в вашем конкретном случае использования, но я надеюсь, что это поможет.

Смежные вопросы