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
}
}
4 Réponses :
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
}
}
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.
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()
}
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.
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 ... "
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
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.