接口和参数多态性
Interfaces and Parameter polymorphism
解决可能的重复问题:我知道什么是接口。我知道如何实施它们以及所有这些。我知道什么是允许用子类型替换对象的多态性。我知道抽象方法是什么,我不是在问这些东西是什么。相反,我问的是在以下问题中无法做到这一点的意义何在。现在回答问题:
我有一个接口。让我们称之为 Foo。它有以下抽象方法:
public boolean isNumeric(Object o);
我还有一个实现 Foo 的 class Bar。它的 isNumeric 方法是这样实现的:
public boolean isNumeric(DataPoint dp){
//some stuff
return true;
}
为什么我不能变形一个抽象参数? 我不能更具体的实现有什么意义? ...这不是多态性的必要性的一部分。允许 "down" a class 并且能够更具体地针对特定情况……似乎我也不能倒退;将接口中的参数声明为DataPoint,实现为Object。
为什么我不能这样做? 我真的必须投它然后在文档中说吗? "It has to be a DataPoint" bla bla bla? 在这种情况下,我不能只强制它成为一个数据点,而在另一个实现中是其他东西吗?如果我必须强制转换,我将不得不处理 class转换异常并反驳定义参数的文档,其中解释说不要使用 "this parameter"... 如果这有意义的话。这似乎比面向对象编程的全部工作要多...
-谢谢
PS问题已加粗。
如果 Bar
的 isNumeric()
旨在覆盖 Foo
的 isNumeric()
方法,那么对于任何 Bar
实例其 isNumeric()
将用于服务任何 isNumeric()
呼叫。这就是多态性的基础。
现在想象有人打电话给:
Foo instance = new Bar();
System.out.println(instance.isNumeric("Hello");
那是绝对有效的 Java 代码。但是你的 Bar.isNumeric(DataPoint)
将无法处理。
这就是为什么在子类中更改为更具体的类型时不能重写方法的原因。您必须保留参数类型。
解决可能的重复问题:我知道什么是接口。我知道如何实施它们以及所有这些。我知道什么是允许用子类型替换对象的多态性。我知道抽象方法是什么,我不是在问这些东西是什么。相反,我问的是在以下问题中无法做到这一点的意义何在。现在回答问题:
我有一个接口。让我们称之为 Foo。它有以下抽象方法:
public boolean isNumeric(Object o);
我还有一个实现 Foo 的 class Bar。它的 isNumeric 方法是这样实现的:
public boolean isNumeric(DataPoint dp){
//some stuff
return true;
}
为什么我不能变形一个抽象参数? 我不能更具体的实现有什么意义? ...这不是多态性的必要性的一部分。允许 "down" a class 并且能够更具体地针对特定情况……似乎我也不能倒退;将接口中的参数声明为DataPoint,实现为Object。
为什么我不能这样做? 我真的必须投它然后在文档中说吗? "It has to be a DataPoint" bla bla bla? 在这种情况下,我不能只强制它成为一个数据点,而在另一个实现中是其他东西吗?如果我必须强制转换,我将不得不处理 class转换异常并反驳定义参数的文档,其中解释说不要使用 "this parameter"... 如果这有意义的话。这似乎比面向对象编程的全部工作要多...
-谢谢
PS问题已加粗。
如果 Bar
的 isNumeric()
旨在覆盖 Foo
的 isNumeric()
方法,那么对于任何 Bar
实例其 isNumeric()
将用于服务任何 isNumeric()
呼叫。这就是多态性的基础。
现在想象有人打电话给:
Foo instance = new Bar();
System.out.println(instance.isNumeric("Hello");
那是绝对有效的 Java 代码。但是你的 Bar.isNumeric(DataPoint)
将无法处理。
这就是为什么在子类中更改为更具体的类型时不能重写方法的原因。您必须保留参数类型。