Par Valentin Brosseau / @c4software
Les Interfaces sont des sortes de classe
Mais celles-ci sont abstraites
Elles ne sont donc pas instantiables
new MonInterface()C'est donc un contrat que la classe doit respecter si elle implémente l'interface.
Nous sommes donc en train de décrire un comportement attendu.
Pratique en cybersécurité pour s'assurer que les classes respectent bien les contraintes.
Interfaces ≠ Héritage

<?php
interface Deplacement{
public function seDeplacer($vers);
}
class Personne implements Deplacement {
public function seDeplacer($vers){
// Logique à écrire
}
}
class Voiture implements Deplacement {
public function seDeplacer($vers){
// Logique à écrire
}
}
class Animal implements Deplacement {
public function seDeplacer($vers){
// Logique à écrire
}
}class Animal implements DeplacementLa partie importante est « implements »
✋ Une classe peut implémenter plusieurs Interfaces
interface DeplacementInterface{
public function seDeplacer();
public function recharger();
}
interface SpeciesInterface{
public function getName();
public function getAge();
}class Cheval implements SpeciesInterface, DeplacementInterface{
public function getName(){
echo "Epona";
}
public function getAge(){
echo 10;
}
public function seDeplacer(){
echo "Galoper";
}
public function recharger(){
echo "Manger";
}
}Array Object implément combien d'interfaces ?
class ExampleActivity : Activity(), OnClickListener {
protected fun onCreate(savedValues: Bundle) {
val button: Button = findViewById(R.id.corky)
button.setOnClickListener(this)
}
// Implement the OnClickListener callback
fun onClick(v: View) {
// do something when the button is clicked
}
}
« Vous allez aimer les interfaces ;) »
interface ApiService {
@GET("/status")
suspend fun readStatus(@Query("identifier") identifier: String): LedStatus
@POST("/status")
suspend fun writeStatus(@Body status: LedStatus): LedStatus
companion object {
/**
* Création d'un singleton pour la simplicité, mais normalement nous utilisons plutôt un
* injecteur de dépendances.
*/
val instance = build()
/**
* Création de l'objet qui nous permettra de faire les appels d'API
*/
private fun build(): ApiService {
val gson = GsonBuilder().create() // JSON deserializer/serializer
// Create the OkHttp Instance
val okHttpClient = OkHttpClient.Builder()
.readTimeout(30, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
.addInterceptor(HttpLoggingInterceptor().setLevel(if (BuildConfig.DEBUG) HttpLoggingInterceptor.Level.BODY else HttpLoggingInterceptor.Level.NONE))
.addInterceptor(Interceptor { chain: Interceptor.Chain ->
val request = chain.request().newBuilder().addHeader("Accept", "application/json").build()
chain.proceed(request)
})
.build()
return Retrofit.Builder()
.baseUrl("http://le.serveur") // Mieux -> BuildConfig.URI_REMOTE_SERVER
.client(okHttpClient)
.addConverterFactory(GsonConverterFactory.create(gson))
.build()
.create(ApiService::class.java)
}
}
}À votre avis, comment les interfaces simplifient les appels réseau ?