【问题标题】:Abstract class and mandatory methods of childs?孩子的抽象类和强制方法?
【发布时间】:2015-03-05 09:19:23
【问题描述】:

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

我将使用这样的结构

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

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

【问题讨论】:

  • 您使用哪个 Java 版本?
  • 您的访问修饰符对 Java 无效。
  • 一般提示总是使用接口,只有在不同子类的某些方法实现相同时才使用抽象类
  • 是的,我只是把它写在文本框里作为一个简单的例子。

标签: java oop interface abstraction


【解决方案1】:

您正在寻找:

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

还要看看其他用户的建议:

  • 方法名使用小写
  • 关键字publicalways 小写
  • 如果您的 Animal 类没有所有子类的通用代码,请使用接口

【讨论】:

  • 为什么方法名以大写字母开头?这违反了 Java 代码标准。
  • 我复制了他的例子。
  • 谢谢,我在执行此操作时遇到错误,但必须去掉花括号。这正是我想要的。我开始学习 C#,当我不注意并匆忙将事情写在纸上时,我仍在使用 c 锐化命名约定。
【解决方案2】:

在这种情况下,抽象类和接口都可以工作。您想要使用抽象类的时候是当您希望在所有子类之间共享公共方法和数据时。例如,如果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");
    }
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 为什么所有方法名都以大写字母开头?这违反了 Java 代码标准。
    • 我只是使用了与提问者相同的风格。
    • 我只是快速输入一个示例,并学习了大部分 C# 编程,因此使用大写的方法名称。
    【解决方案4】:

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

    如果你使用抽象类,你需要重写方法并再次定义它

    【讨论】:

    • 我按预期使用了抽象方法。我这里只是举个例子,所有的孩子都需要很多完全相同的方法,但有些需要稍微不同的方法,但必须的。
    • 如果你想定义强制方法也可以
    猜你喜欢
    • 2011-10-07
    • 2015-02-09
    • 2012-11-14
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 2017-06-04
    • 2012-11-29
    • 1970-01-01
    相关资源
    最近更新 更多