我经常阅读有关多态的定义,例如:
多态是具有不同类型对象的能力 理解同一条消息
但是,如果我们不使用多态性,例如,如果我们有一个类型为Circle
且方法为draw()
的对象,而另一个类型为Rectangle
的对象,则上述定义也适用使用方法draw()
,我们可以做到:
circle1.draw();
rectangle1.draw();
因此circle1
和rectangle1
在不使用多态的情况下理解了同一条消息draw()
!
我想念什么吗?
答案 0 :(得分:2)
在您的示例中,您只有两个不同的类,其中“ draw”方法是相同的,但这不是出于政治目的。
但是,如果您有这样的接口或抽象类:
public class pol {
public static void main(String[] args) {
Shape[] shapes = {new Circle(), new Rectangle()};
for(Shape s: shapes) {
s.draw();
}
}
}
interface Shape {
void draw();
}
class Circle implements Shape{
@Override
public void draw() {
System.out.println("Circle");
}
}
class Rectangle implements Shape{
@Override
public void draw() {
System.out.println("Rectangle");
}
}
然后,即使您以Shape的形式访问它,也会执行每个单独的方法绘制。因此输出将是:
Circle
Rectangle
答案 1 :(得分:1)
我想分享基本示例:
interface Shape{
void draw();
}
class Circle implements Shape{
@Override
void draw(){
//Draw Circle here.
}
}
class Rectangle implements Shape{
@Override
void draw(){
//Draw Rectangle here.
}
}
所以在您的示例中:
circle1.draw();
rectangle1.draw();
您可以安全地同时调用圆形和矩形对象的绘制方法,因为它们实际上都是形状。 circle1既是Circle也是Shape,矩形1既是Rectangle也是Shape。即多态,对象可以是一种以上。
答案 2 :(得分:0)
您提到的draw()方法完全不同,属于不同的类。 是的,在多态中,对象可以理解方法签名,但是有一些区别。 例如,假设他们有一个方法可以设置两个对象的直径,而没有多态性,则您必须实现与对象一样多的方法! 但例如,因为每个对象的确存在差异,因此以自己的方式定义它们的面积。
答案 3 :(得分:0)
以防万一您不喜欢技术答案...
理解多态的一种方法是“一种使代码与执行相同操作的各种方式进行交互的方式,而又不知道其操作方式。”
假设您有一个打印数据的程序。这个概念非常广泛,因此您首先要从txt文件读取。
您将您的课程称为“ TxtReader”。
实施之后,您很快就会意识到txt不是保存数据的好方法....
因此,您决定使用数据库。
现在,您看一下代码,并使用TxtReader.read()对其进行了硬编码。
更改以前被证明可以运行的代码是一个糟糕的主意,因为它可能会带来新的问题。
所以-
您创建一个名为“ Reader”的接口,并为其提供一个方法“ read()”。
现在,您回到代码,并让TxtReader实现Reader。 然后将代码更改为Reader.read()。 现在,只要它包含方法read(),就可以进行任何数量的Reader实现,例如SqlReader,HtmlReader,PhpReader等。
现在,所有这些实现都可以在需要时将其变形为一个简单的Reader。
这使您可以编写代码而不必担心太多可能的实现。 所以我们喜欢使用接口。
对于一个程序员来说,这是一个省时的方法,但是对于任何一个项目,如果有多个人从事同一工作,则可以节省大量的时间和金钱。