1
votes

Faire exécuter une fonction uniquement dans les interfaces Kotlin?

Si j'ai une interface, y a-t-il un moyen simple de déclarer une fonction pour en faire un membre public, mais non remplaçable? Cela signifie qu'il serait exclusivement appelable et ne pourrait pas être défini ou remplacé par ses descendants

interface IFoo {
    fun ExecuteOnly(){
       // Do Something
    }
}


0 commentaires

4 Réponses :


1
votes

Non vous ne pouvez pas. Ce n'est pas ainsi que l' interface de Kotlin est implémentée.

Vous pouvez utiliser une classe abstraite à la place

abstract class Foo {
    fun executeOnly(){
       // Do Something
    }
}


2 commentaires

kotlinlang.org/docs/reference/interfaces.html


Downvotes + lien vers un autre article? Ma réponse est toujours solide, vous ne pouvez jamais rendre une méthode dans une interface publique et non remplaçable en même temps.



-3
votes

Bien sûr, vous pouvez ... En fait, il n'y a pas beaucoup de différence entre les interfaces kotlin et les classes abstraites ... ajoutez simplement un corps et un modificateur privé.

interface MyInterface {
    
    fun triggerTakeMe(){
        takeMe()
    }
    
   private fun takeMe(){
        println("Taken")
    }
}

class MyClass : MyInterface 

fun main() {
    
    val obj = MyClass()
    obj.triggerTakeMe()

}


3 commentaires

Cela ne répond pas à la question. triggerTakeMe peut toujours être remplacé.


Oui. c'est censé être remplacé ... Vous me dites, quel est l'intérêt de rendre chaque méthode privée dans une interface ... Comment pouvons-nous l'appeler une interface si elle ne fournit aucune interface du tout ... lol.


L'intervenant a demandé s'il y avait un moyen de rendre une méthode dans une interface publique et non remplaçable en même temps. Cette réponse n'est pas seulement insatisfaite mais conduit également à un malentendu.



2
votes

J'ai lu récemment un livre de CommonsWare où cette situation a été décrite. et je le cite à partir de là:

"... En conséquence, tout ce qui se trouve dans une hiérarchie d'interface est ouvert en permanence, jusqu'à ce que vous commenciez à implémenter les interfaces dans les classes. Si cela pose un problème - si vous avez une fonction que vous voulez vraiment marquer comme finale - utilisez des classes abstraites, pas des interfaces ... "


1 commentaires

Certainement ce que je cherchais, merci! J'ai pensé que j'aurais besoin de changer ma structure de données, mais je n'étais tout simplement pas sûr. Cela solidifie mon intuition



1
votes

Vous pouvez définir une fonction d'extension sur l'interface.

fun IFoo.executeOnly() {

}

Il sera toujours possible pour quelqu'un de définir une fonction membre avec ce nom dans une classe implémentant IFoo mais l'intention est assez claire. Et de toute façon lors de l' utilisation d' un objet via une IFoo référence la IFoo extension sera choisi.


0 commentaires