孩子的抽象类和强制方法?

时间:2015-01-07 13:03:08

标签: java oop interface abstraction

我有这个抽象的基类,每个孩子都应该有一个特定的强制函数,但略有不同。这可能是使用抽象类还是我应该使用接口?

我将使用这样的结构

public abstract class Animal
{
    //Mandatory method
    Public void sound()
    {

    }
}

public class Cat extends Animal
{
    public void sound()
    {
        System.out.println("Miauw");
    }
}

public class Dog extends Animal
{
    public void sound()
    {
        System.out.println("Woof");
    }
}

//I will put all these child objects in a List<Animal> and need to call these methods.

for (Animal a : animalList)
{
    a.sound();
}

如何进行这种结构?我必须补充说我正在使用抽象类,因为有很多相同的方法需要在子类之间共享。只是有些方法需要彼此不同,但必须从基类中获取并且可以访问。

4 个答案:

答案 0 :(得分:3)

您正在寻找:

public abstract class Animal
{
    //Mandatory method
    abstract public void sound();
}

但也要看其他用户的建议:

  • 使用小写作为方法名称
  • 关键字public始终采用小写
  • 如果您的Animal类没有所有子类的公共代码,则使用接口

答案 1 :(得分:1)

在这种情况下,抽象类和接口都可以工作。您希望使用抽象类的时间是您希望在所有子类之间共享的常用方法和数据。例如,如果Animal有一个权重变量,并且每个子类都设置该变量。

注意:在抽象类中,您不想实现的任何方法都必须声明为抽象。了解我如何修改下面的Sound()。此外,奖励提示是标准说方法名称应以小写字母开头,因此我将Sound更改为sound

public abstract class Animal
{
    private int weight;

    public void setWeight(int weight) {
        this.weight = weight;
    }

    public int getWeight() {
        return weight;
    }

    //Mandatory method
    abstract public void sound();
}

public class Cat extends Animal
{
    public Cat(int weight) {
        this.setWeight(weight);
    }

    public void sound()
    {
        System.out.println("Miauw");
    }
}

public class Dog extends Animal
{

    public Dog(int weight) {
        this.setWeight(weight);
    }

    public void sound()
    {
        System.out.println("Woof");
    }
}

答案 2 :(得分:1)

您正在寻找Java的abstract修饰符。 The official Java Documentation contains more specific information about abstract and final here

public abstract class Animal
{
    // Mandatory method with no "default" implementation.
    public abstract void Sound();

    // Optional method with a default implementation.
    public void Move() {
        // some actions here
    }

    // Optional method with a fixed implementation (it can't be changed in a child class).
    public final void Eat(Food food) {
        // some actions here
    }
}

答案 3 :(得分:0)

你应该在这种情况下使用接口,因为你没有定义任何方法,如果你只想提供声明接口就可以了

如果您通过覆盖方法并再次定义它来使用抽象类