Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java oop接口实现与抽象类_Java_Oop_Design Patterns_Uml - Fatal编程技术网

Java oop接口实现与抽象类

Java oop接口实现与抽象类,java,oop,design-patterns,uml,Java,Oop,Design Patterns,Uml,我有这样一个场景,我有4种动物: A]. Cat i. Name - property ii.Speak - operation B]. Wild Cat i. Name - property ii.Speak - operation iii. Hunt - operation C]. Dog i. Name - property ii.Speak - operation D]. Wild Dog i. Name - property

我有这样一个场景,我有4种动物:

A]. Cat

  i. Name - property

  ii.Speak - operation

B]. Wild Cat

  i. Name - property

  ii.Speak - operation

  iii. Hunt - operation

C]. Dog

  i. Name - property

  ii.Speak - operation

D]. Wild Dog

  i. Name - property

  ii.Speak - operation

  iii. Hunt - operation
现在,我必须为上述四种动物实现类层次结构。我是这样做的:

/////////////////////////Interface iAnimal///////////////////////////////
Interface iAnimalHunter{
    Hunts();
}
Interface iAnimalSpeach{
    Speaks();
}

/////////////////////////Abstract class Animal///////////////////////////////
Abstract class Animal{
    Protected String name;
    protected function Speaks(){
    }
}

/////////////////////////Class Cat///////////////////////////////
Class Cat extends Animal implements iAnimalSpeach{
    Public function Speaks(){
    }
}

/////////////////////////Class WildCat///////////////////////////////
Class WildCat extends Cat implements iAnimalSpeach, iAnimalHunter{
    Public function Speaks(){
    }
    Public function Hunts(){
    }
}

/////////////////////////Class Dog///////////////////////////////
Class Dog extends Animal implements iAnimalSpeach{
    Public function Speaks(){
    }
}

/////////////////////////Class WildDog///////////////////////////////
Class WildDog extends Dog implements iAnimalSpeach, iAnimalHunter{
    Public function Speaks(){
    }
    Public function Hunts(){
    }
}
在面向对象的设计模式方面,我使用接口是正确的还是简单的抽象类(没有接口,允许子类在需要时重写hunt()和speak()方法)是更好的方法?哪种方式更好

你做得很好。 Wild Cat和Dog派生自没有hunt()方法的Cat和Dog类。因此,他们必须独立获得它。在包括Java在内的大多数语言中,禁止有多个父对象。所以,您必须从接口获取hunt()。最好是独立创建函数。如果两种野生动物的狩猎方式相同,您可以在接口中将其声明为默认方法并在那里定义它

至于另一个函数speak(),您可以像以前一样执行它-为了一致性,或者将其放入Animal类中并在具体类中重写它。它有道理,因为它看起来,两只猫都有相同的speak()方法,就像狗一样

至于接口的名称,我将其中一个命名为Speaker,而不是Speaker,类似于Hunter


请注意,在Java中,它们不是
操作
,而是
方法

虽然特定语言代码不是目的,但感谢您的更正并提出了替代解决方案。相反,使用双亲更特定于语言。我们不能完全脱离现实生活。有一个+1-我认为,这是一个很好的例子,在哪里使用接口,在哪里不使用接口。