2013-08-20 3 views
0

Вопрос: this вопрос, я нашел this статью о шаблоне 'config' от Precog. Я попытался это с двумя модулями:Scale cake pattern with Existential Types: compile error

case class Pet(val name: String) 

trait ConfigComponent { 
    type Config 

    def config: Config 
} 

trait Vet { 
    def vaccinate(pet: Pet) = { 
    println("Vaccinate:" + pet) 
    } 
} 


trait AnotherModule extends ConfigComponent { 
    type Config <: AnotherConfig 

    def getLastName(): String 

    trait AnotherConfig { 
    val lastName: String 
    } 

} 

trait AnotherModuleImpl extends AnotherModule { 
    override def getLastName(): String = config.lastName 

    trait AnotherConfig { 
    val lastName: String 
    } 

} 

trait PetStoreModule extends ConfigComponent { 
    type Config <: PetStoreConfig 

    def sell(pet: Pet): Unit 

    trait PetStoreConfig { 
    val vet: Vet 
    val name: String 
    } 

} 

trait PetStoreModuleImpl extends PetStoreModule { 
    override def sell(pet: Pet) { 
    println(config.name) 
    config.vet.vaccinate(pet) 
    // do some other stuff 
    } 
} 

class MyApp extends PetStoreModuleImpl with AnotherModuleImpl { 

    type Config = PetStoreConfig with AnotherConfig 

    override object config extends PetStoreConfig with AnotherConfig { 
    val vet = new Vet {} 
    val name = "MyPetStore" 
    val lastName = "MyLastName" 
    } 

    sell(new Pet("Fido")) 
} 


object Main { 
    def main(args: Array[String]) { 
    new MyApp 
    } 
} 

Однако, я получаю эту компиляцию errror:

overriding type Config in trait AnotherModule with bounds <: MyApp.this.AnotherConfig;
type Config has incompatible type
type Config = PetStoreConfig with AnotherConfig

Это мне не ясно, почему это не должно работать (Precog также использует два компонента в их примере) , есть идеи?

ответ

0

Удалить определение AnotherConfig из AnotherModuleImpl

+0

Спасибо за ответ, однако, я пытался воспроизвести следующую ошибку компиляции: значение petStoreName не является членом PetStoreModuleImpl.this.Config. См. [Здесь] (https://gist.github.com/damirv/6278827) для кода, создающего эту ошибку компиляции. Любая идея почему? – damirv

+0

Я опубликовал последующую информацию об этом [здесь] (http://stackoverflow.com/questions/18330848/scala-cake-pattern-compile-error-with-precog-config-pattern) – damirv

1

Вы определяете AnotherConfig дважды - один раз в AnotherModule, и снова в AnotherModuleImpl. Эти два определения признака различны и считаются несовместимыми. Тип Config определяется в терминах первого из них, но когда вы определяете MyApp, вы устанавливаете тип последним - следовательно, ошибка.

Вы можете исправить это, либо удалив последнее определение AnotherConfig (как это было предложено @rarry), либо последнее свойство расширяет первое (если у вас есть причина сохранить последнее, например, определить дополнительные поля).

+0

Спасибо за объяснение, Я опубликовал последующую информацию об этом [здесь] (http://stackoverflow.com/questions/18330848/scala-cake-pattern-compile-error-with-precog-config-pattern) – damirv