【发布时间】:2020-08-21 05:13:17
【问题描述】:
我经常阅读多态性的定义,如下所示:
多态是拥有不同类型对象的能力 理解相同的信息
但如果我们不使用多态性,上述定义也适用,例如,如果我们有一个 Circle 类型的对象,其方法为 draw(),另一个类型为 Rectangle 的对象,其方法为 draw() ,我们可以这样做:
circle1.draw();
rectangle1.draw();
所以circle1 和rectangle1 在不使用多态的情况下理解了同一条消息draw()!
我错过了什么吗?
【问题讨论】:
-
这里的两个
draw调用并不是真正的 same 消息,是吗?我不能对未知对象(可能是Circle或Rectangle)、draw说,并期望他们理解,可以吗? -
嗨,你在这里所做的隐藏了多态性。这个想法是你有一些更远的 Circle 和 Rectangle 接口,你可以在 ScreenRefresh 类中创建一些绘制方法。该绘制方法将绘制您拥有的所有“效果”、动画、粒子和形状。理想情况下,它将所有内容存储在 Drawable 数组中,并在循环中执行 item.draw()。
-
简单的答案是消息不是
draw(),而是Circle.draw()和Rectangle.draw()。如果有一个公共基类Shape,circle1和rectangle1都会理解消息Shape.draw()——在这种情况下是公共消息。 -
@Sweeper “虽然这两个draw call并不是真正的相同消息,是吗?”我们可以说
circle1.draw()没有发送draw()消息到circle1,而是发送Circle.draw()消息?如果我们做Shape shape1 = new Circle(); shape1.draw();(假设Shape是Circle的超类),那么shape1不会向Circle对象发送draw()消息,而是发送Shape.draw()消息(因此Circle对象现在可以理解两条消息:Circle.draw()和Shape.draw(),这两条消息具有相同的实现/消息处理程序)? -
@Tom 我的意思是
Shape.draw和Circle.draw在Shape和Circle是不相关类型的条件下是不同的消息,OP 似乎暗示了“没有多态性”这句话.如果Circle继承自Shape,我会说它们是相同的消息。
标签: java oop polymorphism