java - 可以使用组合而不是继承来实现 Polymorphysim 吗?(在 Java 中)
问题描述
我正在学习 Java,我知道继承和组合是什么,我看到了许多使用继承的多态模拟示例,所以我的第一个问题是,可以使用组合来完成吗?如果是,请举一个小例子。
我的第二个问题是,可以说 polymorphysim 基本上是方法重载和/或方法重载吗?如果是,那为什么?
解决方案
第一个问题
在 Java 中可以通过两种方式实现多态:
- 通过类继承:
class A extends B
- 通过接口实现:
class A implements C
。
在后一种情况下,为了正确实现 A 的行为,可以通过组合来完成,使 A 委托给其他一些执行接口 C 中指定的任务的类。
示例:假设我们已经有一些实现接口 C 的类:
class X implements C
{
public String getName() {...}
public int getAge() {...}
}
我们如何创建一个具有与 X 相同行为的实现 C 的新类?像这样:
class A implements C
{
private C x=new X();
public String getName() {return x.getName();}
public int getAge() {return x.getAge();}
}
第二个问题
不,多态性不是方法重载和/或方法覆盖(实际上,重载与面向对象设计无关):
- 方法重载包括创建一个新方法,该方法与同一类中的其他(可能继承的)方法具有相同的名称,但具有不同的签名(=参数编号或类型)。添加新方法是可以的,但这不是多态性的目的。
- 方法覆盖包括为继承的方法设置一个新的主体,以便这个新的主体将在当前类中执行,而不是在继承的方法的主体中执行。这是多态性的一个优点,也不是它的基础。
简而言之,多态性是一个类被用作不同类/接口的能力。
推荐阅读
- azure-devops - Azure Devops Pipelines 是否有 json 架构文件
- java - 为什么在这个算法中执行 IF 语句没有错误?
- webassembly - 如何在 wasm 中构建多维数组?
- javascript - 请求 ArrayBuffer 的 XmlHttpRequest 会导致垃圾
- android - 在瓷砖和网格之间切换时的 RecyclerView 动画
- ubuntu - 如何修复 postfix myhosting 配置问题?
- python - Python OpenCV从外部摄像头返回黑色图像
- sftp - Mule sftp 入站连接器在处理 20K 文件后停止轮询文件
- c++ - 何时调用 C++ 析构函数类?
- javascript - 您如何转换音频进度条码以使其具有渐变?