java - 在同一对象上使用抽象和接口(interface),而无需对其进行强制转换

标签 java interface abstract abstraction

我想在同一个对象上使用抽象(来自母类)和接口(interface),而无需对其进行强制转换。

我已经搜索过它,似乎强制转换是实现这种目的的常用方法。

我有一个程序,其中 Dog 扩展 Animal 实现 Friendly

动物让狗yell(),友好(界面)让他hug() 在使用Friendly(Interface)之前,我曾经这样做过:

Animal dog = new Dog();
dog.yell();

但是现在,要添加界面,我必须将狗转换为像这样的友好类型,以便他可以拥抱():

Animal dog = new Dog();
dog.yell();
((Friendly) dog).hug();

有没有更好的方法来做到这一点,因为我的老师告诉我,选角通常是一个坏主意。

最佳答案

如果您需要避免强制转换,则必须使用 Dog 作为 dog 变量的类型:

Dog dog = new Dog();
dog.yell();
dog.hug();

但是,有了这个,您就不会针对 FriendlyAnimal 接口(interface)进行编程,而理想情况下,您应该在正确使用抽象时执行这些操作。 如果您必须在代码中将 dog 声明为 AnimalFriendly,就像这样,那么您正在使用抽象出于错误的原因。

...my teacher told me that casting was usually a bad idea.

选角是一件没有人喜欢做的事情,但每个人在必要的时候都必须这样做。

关于java - 在同一对象上使用抽象和接口(interface),而无需对其进行强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53896076/

相关文章:

java - Spring Autowiring

c - 无需复制粘贴即可实现不同但相似的结构/功能集

class - 我在哪里可以找到 UML 类图的官方元模型?

java - Java中实例化抽象类: Why does this work?

使用 ArrayList 时出现 java.lang.IndexOutOfBoundsException : Index: 0, 大小:0

java - java的int序列化数组

java - 我必须在所有 jar 上签名吗?

interface - Mongodb - 当属性具有 Interface 返回类型时如何反序列化

c# - 单独的 getter 和 setter 声明

java - 找不到符号 - 构造函数 JAVA