JavaRush /Blog Java /Random-FR /Fermetures et rappels. Besoin de conseils.
Konkistador
Niveau 28

Fermetures et rappels. Besoin de conseils.

Publié dans le groupe Random-FR
Dans le chapitre « Classes internes » du livre de B. Eckel sur le thème « Fermetures et rappels », l'exemple de code suivant est présenté : //innerclasses/Callbacks.java // Использование внутренних классов // для реализации обратных вызовов package innerclasses; interface Incrementable { void increment(); } // ПРОСТО реализуем интерфейс: class Callee1 implements Incrementable { private int i = 0; public void increment() { i++; System.out.println(i); } } class MyIncrement { public void increment() { System.out.println("Другая операция"); } public static void f(MyIncrement mi) { mi.increment(); } } // Если ваш класс должен вызывать метод increment() // по-другому, необходимо использовать внутренний класс class Callee2 extends MyIncrement { private int i = 0; private void increment1() { super.increment(); i++; System.out.println(i); } private class Closure implements Incrementable { public void increment() { // Указывается метод внешнего класса, иначе // возникает бесконечная рекурсия: Callee2.this.increment1(); } } Incrementable getCallbackReference() { return new Closure(); } } class Caller { private Incrementable callBackReference; Caller(Incrementable cbh) { callBackReference = cbh; } void go() { callBackReference.increment(); } } public class Callbacks { public static void main(String[] args) { Callee1 c1 = new Callee1(); Callee2 c2 = new Callee2(); MyIncrement.f(c2); Caller caller1 = new Caller(c1); Caller caller2 = new Caller(c2.getCallbackReference()); caller1.go(); caller1.go(); caller2.go(); caller2.go(); } } Le compilateur signale qu'il ne peut pas remplacer la méthode incrément() dans la classe Callee2. Une tentative a été effectuée pour attribuer des privilèges d'accès inférieurs. Et cela est compréhensible, en Java lors de l'héritage, il est possible de modifier les modificateurs d'accès uniquement dans le sens d'une plus grande visibilité. Dites-moi ce que l'auteur a voulu transmettre ? Où est la faute de frappe ici ?
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION