猿问

Java接口对扩展抽象类的具体类的引用

我试图了解Java为什么如此工作。

假设我有:

  1. 界面-IAnimal

  2. 抽象类-哺乳动物

  3. 具体课程-狗

Mammal实现IAnimalDog扩展Mammal

Mammal声明并实现该方法breastFeed()(当然Animal,没有此签名,因为并非每只动物都是哺乳动物)

现在,我想创建一个dog对象,该接口将以这种方式引用此dog:

IAnimal dog = new Dog();

在运行时的某个地方,我可能想使用该breastFeed方法,但是dog对象无法识别该方法。

一种解决方案是在Dog类中实现此方法。其他解决方案是Dog从Abstract类进行引用,该类实现了接口,在这种情况下,我将所有内容都交给dog对象。

我发现这些解决方案是混乱而又怪异的。有什么想法吗?也许我错过了一些东西,并且有一些更好更清洁的解决方案?


哆啦的时光机
浏览 162回答 3
3回答

慕哥9229398

您应该完全忘记该方法,breastFeed因为这只是一个规范。只需添加一个方法feed()进入IAnimal,然后让实现决定如何吃:interface IAnimal{    void feed();}abstract class Mammal implements IAnimal{}ADog可能会吃一些肉:class Dog extends Mammal{     public void feed(){         System.out.println("Eating meat!");     }}而一个人BabyCat可能会喝一些牛奶:class BabyCat extends Mammal{     public void feed(){         System.out.println("Drinking milk!");     }}这是要走的路,因此在声明狗时如下:IAnimal animal = new Dog();然后,您可以致电anmial.feed()。然后让实现来处理其余的事情。

天涯尽头无女友

这是有效的,因为您有继承链。但是这里的事情是,dog被声明为IAnimal,并且只公开该接口具有的方法,而不公开实现中的方法。如果需要访问该breastFeed()方法,则应将值强制转换为子类。

回首忆惘然

我不会在这里使用接口,因为所有行为都是继承的。但是,使用IAnimal dog = new Dog();dog只能访问IAnimal方法。因此,如果要将dog存储到Mammal变量中,则可以访问该breastFeed()方法。例如:public abstract class Animal {    public abstract void feed();}public abstract class Mammal extends Animal {    public abstract void breastFeed();}public class Dog extends Mammal{    @Override    public void breastFeed() {        System.out.println("Drinking milk!");    }    @Override    public void feed() {        System.out.println("Eating meating");    }}public class TryingAnimal {    public static void main(String[] args) {        Dog dog = new Dog();        dog.breastFeed();        dog.feed();        Animal animal = dog;        animal.feed();        Mammal mammal = dog;        mammal.breastFeed();    }}希望这可以帮助。
随时随地看视频慕课网APP

相关分类

Java
我要回答