摘要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 你会通过覆盖方法并重新定义它来增加开销
我有这个抽象基础 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 你会通过覆盖方法并重新定义它来增加开销