Faites vos classes en Kotlin

Juste quelques bouts de code pour montrer de quelle maniĂšre on peut faire ses 1Ăšres classes en Kotlin.

Mode rapide

class Human(val firstName : String, val lastName : String) {

    fun sayHello() {
        println("Hello $firstName $lastName")
    }
}

fun main(args : Array<String>) {
    var bob = Human("bob", "morane")
    bob.sayHello()

    println(bob.firstName+" "+bob.lastName)

}

Exécution :

Hello bob morane
bob morane

A noter :

  • typage : Ă  droite
  • mot clĂ© pour une fonction ou mĂ©thode : fun
  • possibilitĂ© de dĂ©clarer les membres en paramĂštres de la classe (on parle de “primary constructor”)
  • propriĂ©tĂ©s gĂ©nĂ©rĂ©es automatiquement
  • notez le mot-clĂ© val, vous ne pourrez pas par exemple dans la mĂ©thode sayHello faire un firstName = "Hello" ou un this.firstName = "Hello" (vous ne pouvez pas “rĂ©-assigner” les val)
  • si bous n’utilisez pas val (ou var) en paramĂštre du constructeur primaire, vous n’aurez pas de propriĂ©tĂ© gĂ©nĂ©rĂ©e
  • pas de ;, mais vous pouvez quand mĂȘme en mettre
  • pas de new, instanciation Ă  l’affectation
  • pas d’obligation de “typer” bob, mais vous pourriez Ă©crire var bob : Human = Human("bob", "morane")

On ajoute un constructeur

class Human(val firstName : String, val lastName : String) {

    Human() {
        println("I'm the constructor of $firstName $lastName")
    }

    fun sayHello() {
        println("Hello $firstName $lastName")
    }
}

Exécution :

I'm the constructor of bob morane
Hello bob morane
bob morane

Cool : les propriĂ©tĂ©s ! (mais qu’est ce que vous foutez chez Oracle/Java !?!)

class Human(first : String, last : String) {
    private var _firstName = first
    private var _lastName = last

    public var FirstName : String
    get() {
        return _firstName
    }
    set(value) {
        _firstName = value
    }

    public var LastName : String
    get() { return _lastName }
    set(value) { _lastName = value }

    Human() {
        println("I'm the constructor of $_firstName $_lastName")
    }

    fun sayHello() {
        println("Hello $_firstName $_lastName")
    }

}

fun main(args : Array<String>) {
    var bob  = Human("bob", "morane")
    bob.sayHello()

    println(bob.FirstName+" "+bob.LastName)
    bob.FirstName = "BOB"
    bob.LastName = "MORANE"
    println(bob.FirstName+" "+bob.LastName)

}

A noter :

  • j’ai enlevĂ© val dans les paramĂštres de la classe (du constructeur “primaire”) sinon nous aurions des propriĂ©tĂ©s first et last en plus des propriĂ©tĂ©s FirstName et LastName

Exécution :

I'm the constructor of bob morane
Hello bob morane
bob morane
BOB MORANE

HĂ©ritage

Alors de base, les classes sont final, il faut donc les prĂ©fixer par le mot-clĂ© open si l’on souhaite en hĂ©riter :

//ajouter open devant la classe

open class Human(first : String, last : String) {
    private var _firstName = first
    private var _lastName = last

    public var FirstName : String
    get() {
        return _firstName
    }
    set(value) {
        _firstName = value
    }

    public var LastName : String
    get() { return _lastName }
    set(value) { _lastName = value }

    Human() {
        println("I'm the constructor of $_firstName $_lastName")
    }

    fun sayHello() {
        println("Hello $_firstName $_lastName")
    }

}

class SuperHero(first : String, last : String, val HeroName : String) : Human(first,last) {

}

fun main(args : Array<String>) {

    var Clark = SuperHero("Clark","Kent", "Super Man")
    Clark.sayHello()
    println(Clark.HeroName)

}

Exécution :

I'm the constructor of Clark Kent
Hello Clark Kent
Super Man

Surcharge

Comme pour la classe, il faudra utiliser le mot-clĂ© open avant un membre de la classe pour pouvoir le surcharger (il faudra aussi que la classe soit open : pas de membre open dans une classe final, et un membre “surchargĂ©â€ est par dĂ©faut open, Ă  moins de le prĂ©fixĂ© par final), donc si on veut surcharger sayHello de Human :

open class Human(first : String, last : String) {
    private var _firstName = first
    private var _lastName = last

    public var FirstName : String
    get() {
        return _firstName
    }
    set(value) {
        _firstName = value
    }

    public var LastName : String
    get() { return _lastName }
    set(value) { _lastName = value }

    Human() {
        println("I'm the constructor of $_firstName $_lastName")
    }
	
	//ajouter open devant la méthode
	
    open fun sayHello() {
        println("Hello $_firstName $_lastName")
    }

}

class SuperHero(first : String, last : String, val HeroName : String) : Human(first,last) {
	
    final override fun sayHello() {
        println("Hello " +  FirstName + " " + LastName + ", " + HeroName)
    }
}

fun main(args : Array<String>) {

    var Clark = SuperHero("Clark","Kent", "Super Man")
    Clark.sayHello()

}

Exécution :

I'm the constructor of Clark Kent
Hello Clark Kent, Super Man

One more thing : Super !

Si vous voulez appeler la méthode de la classe mÚre dans votre surcharge, utilisez super<supertype_name>.overrided_method() :

class SuperHero(first : String, last : String, val HeroName : String) : Human(first,last) {
    final override fun sayHello() {
        super<Human>.sayHello()
        println("Your HeroName is $HeroName")
    }
}

Exécution :

I'm the constructor of Clark Kent
Hello Clark Kent
Your HeroName is Super Man

Multi-héritage ?


 Nous verrons ça dans un prochain article 
 Il faut que j’aille bosser.

1Ăšres impressions

Je ne sais pas vous, mais en ce qui me concerne, ce nouveau langage me plaßt beaucoup, une touche de Java, une touche de Javascript, une touche de C# (les propriétés !, 
 qui existent aussi en Javascript ;) ).

Et le bruit qui court du moment : la Team Kotlin voudrait utiliser Play!Framework :) ça va ĂȘtre une bonne annĂ©e !

blog comments powered by Disqus

Related posts