摘要class 和childs 的强制方法?

Abstract class and mandatory methods of childs?

我有这个抽象基础 class,它的每个 child 都应该有一个特定的强制功能,但略有不同。这可能使用抽象 class 还是我应该为此使用接口?

我将使用这样的结构

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

如何处理这个结构?我必须补充一点,我使用的是抽象 class,因为有很多相同的方法需要在 child class 之间共享。只是一些方法需要彼此不同,但必须从基础 class.

访问

您正在寻找:

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

还要看看其他网友的意见:

  • 方法名称使用小写字母
  • 关键字public总是小写
  • 如果您的 Animal class 没有所有 children classes
  • 的通用代码,请使用接口

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

注意:在抽象 class 中,任何您不想实现的方法都必须声明为抽象。看看我是如何修改下面的 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");
    }
}

您正在寻找 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
    }
}

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

如果你使用抽象 class 你会通过覆盖方法并重新定义它来增加开销