Java 没有方法与字段的接口

Java 没有方法与字段的接口,java,oop,design-patterns,Java,Oop,Design Patterns,我有两个类,livingbearth,和继承自它的Animal 我想为每个现有的动物实现一个类,但由于不同的动物有很多相同的特性,我想能够将动物分为几个类别: 飞行、散步、游泳、食肉动物、素食者等等 每种动物都可以居住在几个地方,甚至来自同一地区,例如飞行、行走和食肉动物 此外,每个类别可能有几个独特的属性,例如飞行动物应包括速度和进食类型(例如,它是坐在树上捡虫子,还是“袭击”地球并用腿捡动物) 我肯定要避免的第一件事是为每个具体的动物实现保留一组不同的字段 现在,由于有些类别是简单的二元(食

我有两个类,
livingbearth
,和继承自它的
Animal

我想为每个现有的动物实现一个类,但由于不同的动物有很多相同的特性,我想能够将动物分为几个类别: 飞行、散步、游泳、食肉动物、素食者等等

每种动物都可以居住在几个地方,甚至来自同一地区,例如飞行、行走和食肉动物

此外,每个类别可能有几个独特的属性,例如飞行动物应包括速度和进食类型(例如,它是坐在树上捡虫子,还是“袭击”地球并用腿捡动物)

我肯定要避免的第一件事是为每个具体的动物实现保留一组不同的字段

现在,由于有些类别是简单的二元(食肉动物或素食主义者),有些则绝对不是,我想知道什么是正确的实现方式

我倾向于每个类别的接口,即使它们不包含任何方法,但我遇到了冲突:

  • 对于像IsMeeting这样的简单用途,持有一个包含一个布尔字段的接口看起来很奇怪
  • 另一方面,将几个类别作为动物场,将其他几个类别作为接口实现,听起来非常错误和混乱
就设计而言,这里的正确/最佳选项是什么?(也许有一个
与此用例匹配的设计模式)

您似乎描述的模式是a或a的模式

mixin是一种语言概念,允许程序员向类中注入一些代码。Mixin编程是一种软件开发风格,其中功能单元在一个类中创建,然后与其他类混合

有些语言,比如Scala,已经有了

在Java8中,在默认方法的帮助下,在某种程度上,我这样说,因为这就是默认方法被设计的原因

现在,在没有你所做的全部细节的情况下,很难对你的设计提出建议,但我将试着给出一个我如何从我的角度看待它的例子

让我们关注一下饮食概况:食肉动物与食草动物。食肉动物吃其他动物,食草动物吃植物或植物性食物,杂食动物可能两者兼而有之。动植物都是可食用的材料

interface Edible {
   Collection<Nutrients> getNutrients();
}

interface Vegetal extends Edible {}
interface Animal extends Edible{}
现在您可以定义

class Chicken implements Herbivore {}
class Lion implements Carnivore {}
class Bear implements Omnivore {}
现在一只
只能吃
植物
类型的东西,而
狮子
只能吃
动物
类型的东西,而
可以吃任何
可食用的
东西

我在接口动物的默认方法上放的细节越多,我需要在这些类中实现的细节就越少,这也许是实现您想要的方法


我知道我可能无法回答你的问题,但我希望我至少能给你一些想法,让你知道在哪里可以继续研究和实验理想的解决方案。

从面向对象的角度来看,你可以使用抽象类,但使用Java,您将需要做一些选择来定义最逻辑的继承结构,并添加其余的使用关系。在Java 8中,您可以在接口中添加默认实现,这并不完美,但在某些情况下可以做到这一点(也要注意这种用法)。如果他们没有方法,您可能需要检查这一点,您只需要查看他们是否有方法,只需使用一个属性。@YthioCsi主题似乎与我的问题相匹配,但问题是,通过使用这个范例,Animal类将有大量字段(因为我需要字段而不是方法),因此每个继承类将保存所有这些字段,这让我回到了最原始的实现。也许更好的办法是让动物类几乎裸体,并为每个可能的类别创建一个继承类,然后使用多重继承?首先,让我们通过将相关类别分组来组织信息,如飞行、行走、集体游泳和食肉、素食等。由于每个组只能保存特定的正确值集,这意味着它们实际上是枚举。因此我们将有
MovementType
Enum和
FoodType
Enum。因此,您可以将这些枚举仅用于Animal类中的属性。
interface Carnivore extends Animal<Animal> { }
interface Herbivore extends Animal<Vegetal> { }
interface Omnivore extends Animal<Edible> { }
class Chicken implements Herbivore {}
class Lion implements Carnivore {}
class Bear implements Omnivore {}