2011-12-14 29 views
8

que tienen la siguiente interfaz y clase abstracta que implementa:Java clase abstracta implementa la interfaz

interface Walk { 
    String walk(); 
} 

public abstract class Animal implements Walk { 
    abstract String MakeNoise(); 
} 

Y las siguientes implementaciones concretas:

class Cat extends Animal { 
    String MakeNoise() { 
     return "Meow"; 
    } 

    @Override 
    String walk() { 
     return "cat is walking"; 
    } 
} 

class Dog extends Animal { 
    @Override 
    String walk() { 
     return "Dog is walking"; 
    } 

    @Override 
    String MakeNoise() { 
     return "bark"; 
    } 
} 

class Human { 
    public void Speak() { 
     System.out.println("...Speaking..."); 
    } 
} 

Poniendo todo junto:

class MainClass { 
    public static void main(String[] args) { 
     Random randomGen = new Random(); 

     Animal[] zoo = new Animal[4]; 
     zoo[0] = new Cat(); 
     zoo[1] = new Dog(); 
     zoo[2] = new Cat(); 
     zoo[3] = new Cat(); 
     // System.out.println(zoo[ randomGen.nextInt(2)].MakeNoise()); 
     for (Animal animal : zoo) { 
      if (animal instanceof Dog) { 
       Dog jeffrey = (Dog) animal; 
       System.out.println(jeffrey.MakeNoise()); 
      } 

     } 
    } 
} 

Recibo este error

"caminar() en Cat no puede implementar caminar() en Walk".

¿Alguna idea? gracias

+2

Eso no es lo que dice el error. –

+0

lo he editado – Marin

+0

una pregunta mía ... ¿Animal debería proporcionar una "implementación" (aunque sea un método abstracto) de caminar()? – SJuan76

Respuesta

18

Los métodos en las interfaces son implícitamente public. Sin embargo, los métodos en las clases son visibles para el paquete por defecto. No se puede reducir la visibilidad de un método sobreescrito, es decir que no puede hacer cosas como esta:

class A { 
    public foo() {} 
} 

class B extends A { 
    private foo() {} // No! 
} 

class C extends A { 
    foo() {}   // No! foo is package-visible, which is lower than public 
} 

En su caso, la solución es declarar walk() como public en Dog y Cat.

+1

Lo que me sorprende es que la interfaz se declaró como paquete no público.Gracias – Marin

+1

Eso fue una buena captura, Oli. Te digo, el peor de los errores con los que he tenido que lidiar siempre se ha convertido en tonterías como esta. – Inversus

1

Los métodos de interfaz deben ser públicos. Debe declarar walk() como método público en Cat.

2

El eclipse del error da es:

no pueden reducir la visibilidad del método heredado de Paseo

El método debe ser pública, porque se define en una interfaz.

1

Realice String walk() implementaciones public. Eso lo arreglará

Cuestiones relacionadas