我有抽象类Pet
和抽象方法feed(...)
。该方法必须仅适用于某些三种类型的食物(干、湿或生)。这些可以是 String 类型,因为我仅在后面的逻辑中将它们用作 SWITCH 中的指示符。我还有两个子类 Cat
和 Dog
。他们实现了 Pet 的 feed(...)
方法。我最接近的是使用 ENUM:
Pet.java:
public abstract class Pet {
public enum FoodType {
DRY,
WET,
RAW;
}
public abstract void feed(FoodType foodType);
}
Cat.java:
public class Cat extends Pet {
public void feed(FoodType foodType) {
switch (foodType) {
case DRY:
System.out.println("Feeding this cat dry food.");
break;
case RAW:
System.out.println("Feeding this cat raw food.");
break;
case WET:
System.out.println("Feeding this cat wet food.");
break;
}
}
}
Dog.java:
public class Dog extends Pet {
public void feed(FoodType foodType) {
// implementation similar to feed() in Cat.
}
}
应用程序.java:
import pets.Dog;
import pets.Pet;
public class App {
public static void main(String[] args) {
Dog dog01 = new Dog();
dog01.feed(Pet.FoodType.DRY);
}
}
但我不喜欢这样,因为默认情况下 ENUMS 是静态的 FoodType
可以从项目中的任何位置访问。无需创建 Cat
或 Dog
对象,我就可以从任何地方调用 Pet.FoodType.DRY
。最好它应该只与继承自 Pet 的对象关联,例如:
Dog dog01 = new Dog();
dog01.FoodType.DRY; // do smth with this
最佳答案
发生这种情况是因为您已将 FoodType 声明为公共(public)。请将其替换为 protected,此问题将得到解决。
protected enum FoodType
为了解决这个问题,我们可能可以将其实现为业务逻辑
public abstract class Pet {
protected String[] foodType = new String[]{"RAW","DRY","WET"};
protected final String RAW_FOOD_TYPE = "RAW";
protected final String DRY_FOOD_TYPE = "DRY";
protected final String WET_FOOD_TYPE = "WET";
public abstract void feed(String foodType);
public String getRawFoodType()
{
return RAW_FOOD_TYPE;
}
public String getDryFoodType()
{
return DRY_FOOD_TYPE;
}
public String getWetFoodType()
{
return WET_FOOD_TYPE;
}
}
public class Cat extends Pet {
public void feed(String foodType)
{
if(foodType.equals(DRY_FOOD_TYPE))
{
System.out.println("Feeding this cat dry food.");
}
else if(foodType.equals(RAW_FOOD_TYPE))
{
System.out.println("Feeding this cat raw food.");
}
else if(foodType.equals(WET_FOOD_TYPE))
{
System.out.println("Feeding this cat wet food.");
}
else
{
throw new RuntimeException("Invalid foodtype");
}
}
}
public class App {
public static void main(String[] args) {
Cat cat01 = new Cat();
cat01.feed(cat01.getDryFoodType());
}
}
```
关于java - 强制对象字段仅具有从父类继承的某些值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61017072/