为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

哆啦的时光机 2021-04-30 06:07:16
我试图了解Java为什么如此工作。假设我有:界面-IAnimal抽象类-哺乳动物具体课程-狗Mammal实现IAnimal和Dog扩展Mammal。Mammal声明并实现该方法breastFeed()(当然Animal,没有此签名,因为并非每只动物都是哺乳动物)现在,我想创建一个dog对象,该接口将以这种方式引用此dog:IAnimal dog = new Dog();在运行时的某个地方,我可能想使用该breastFeed方法,但是dog对象无法识别该方法。一种解决方案是在Dog类中实现此方法。其他解决方案是Dog从Abstract类进行引用,该类实现了接口,在这种情况下,我将所有内容都交给dog对象。我发现这些解决方案是混乱而又怪异的。有什么想法吗?也许我错过了一些东西,并且有一些更好更清洁的解决方案?
查看完整描述

3 回答

?
慕哥9229398

TA贡献1877条经验 获得超6个赞

您应该完全忘记该方法,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()。然后让实现来处理其余的事情。


查看完整回答
反对 回复 2021-05-12
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

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


查看完整回答
反对 回复 2021-05-12
?
回首忆惘然

TA贡献1847条经验 获得超11个赞

我不会在这里使用接口,因为所有行为都是继承的。但是,使用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();

    }


}

希望这可以帮助。


查看完整回答
反对 回复 2021-05-12
  • 3 回答
  • 0 关注
  • 161 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信