2011-12-14 5 views
8

Tôi có giao diện sau và lớp trừu tượng mà thực hiện nó:Java lớp trừu tượng thực hiện giao diện

interface Walk { 
    String walk(); 
} 

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

Và việc triển khai cụ thể như sau:

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..."); 
    } 
} 

Đưa nó tất cả cùng nhau:

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()); 
      } 

     } 
    } 
} 

Tôi gặp lỗi này

"walk() trong Cat không thể triển khai walk() trong Walk".

Bất kỳ ý tưởng nào? cảm ơn

+2

Đó không phải là những gì lỗi nói. –

+0

xin lỗi tôi đã chỉnh sửa nó – Marin

+0

một câu hỏi của riêng tôi .... nên động vật cung cấp một "thực hiện" (ngay cả khi nó là một phương pháp trừu tượng) của walk()? – SJuan76

Trả lời

18

Phương thức trong giao diện hoàn toàn là public. Tuy nhiên, các phương thức trong các lớp được hiển thị theo mặc định. Bạn không có thể làm giảm tầm nhìn của một phương pháp overriden, ví dụ: bạn không thể làm những thứ như thế này:

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 
} 

Trong trường hợp của bạn, giải pháp là để khai báo walk() như public trong DogCat.

+1

Điều làm tôi ngạc nhiên là giao diện được khai báo là gói không công khai.Cảm ơn – Marin

+1

Đó là một điều thú vị, Oli. Tôi nói với ya, những lỗi tồi tệ nhất mà tôi phải đối phó luôn luôn là những thứ ngớ ngẩn như thế này. – Inversus

1

Phương thức giao tiếp phải được công khai. Bạn cần khai báo walk() như một phương thức công khai trong Cat.

2

Vòng elip lỗi cho là:

Không thể làm giảm tầm nhìn của các phương pháp kế thừa từ Walk

Phương pháp này phải được công khai, bởi vì nó được định nghĩa trong một giao diện.

1

Thực hiện String walk() triển khai public. Điều đó sẽ sửa chữa nó