子类化枚举
2022-09-02 23:39:22
有没有一种简单的方法来子类化Java?enum
我问这个是因为我有10个实现相同的接口,但它们在某些方法中也有相同的实现,所以我想通过将所有相同的实现放在扩展的中间对象中来重用代码,它也是我需要的所有其他超类。Enum
也许它并不像我想的那么简单?
提前致谢
有没有一种简单的方法来子类化Java?enum
我问这个是因为我有10个实现相同的接口,但它们在某些方法中也有相同的实现,所以我想通过将所有相同的实现放在扩展的中间对象中来重用代码,它也是我需要的所有其他超类。Enum
也许它并不像我想的那么简单?
提前致谢
你不能这样做,因为语言不允许你这样做。出于一个很好的逻辑原因:只有当您可以从子类中删除一些枚举值而不是添加新枚举值时,子类化枚举才有意义。否则,您将破坏里氏替换原理。
简而言之,这说明,只要需要超类的实例,子类的每个实例都应该是可以接受的。如果在枚举子类中添加新的枚举成员,则显然不能被仅知道超级枚举的人接受。
有关更多详细信息和可能的替代方案,请参阅我之前的答案。
在你具体的例子中,@Jason的建议可能会提供一个很好的解决方案(对他来说+1:-)
好点,我上面有点马虎:-)在实现方面,你是对的。但是,从逻辑角度来看,枚举类型完全由其有效值的集合来描述。通常,适当的子类是其超类的特化。换句话说,有效子类实例集(应该)始终是超类实例集的子集。(每只狗都是动物,但不是每只动物都是狗。
我问这个是因为我有10个实现相同接口,但它们也对某些方法具有相同的实现,所以我想通过将所有相同的实现放在扩展Enum的中间对象中来重用代码,它也是我需要的所有其他超类。
使用静态帮助程序类怎么样?
interface Animal
{
public void speak();
}
class AnimalHelper
{
public static void speakHelper(Animal animal) {
// common methods here
}
}
enum Dog implements Animal { SCHNAUZER, LABRADOR, ST_BERNARD, DACHSHUND;
@Override public void speak() {
AnimalHelper.speakHelper(this);
}
};
enum Bird implements Animal { OWL, FINCH, DUCK, GOOSE; }
@Override public void speak() {
AnimalHelper.speakHelper(this);
}
};