继承中的协方差
Covariance in inheritance
我有一个超级 class SheetBuilder 和许多继承此 class 的子 classes。
super class 有一个所有 classes 继承的抽象方法。
protected abstract void printResults(String abc);
现在我想用不同的参数重载相同的方法,但我只需要对一个子程序执行此操作 class。所以我改变了抽象方法如下,
protected abstract void printResults(Object abc);
这样我就可以用我想要接收的任何对象类型来实现我的子 class,
子 class 实现:
protected void printResults(int abc) {
//
}
这是正确的标准吗?还有其他方法可以实现吗?
protected abstract void printResults(Object abc);
Now I want to overload the same method with a different parameter but
I need to do this only for one sub class. So I changed the abstract
method as below,
Is this the correct standard or this there any other way to achieve
this?
不,对象太宽。从客户端,如果你想通过接口编程,你必须调用这个 printResults(Object abc);
.
你可以把任何类型的实例放在里面。
此外,我认为您混合了覆盖和重载。这是重载而不是覆盖,因为覆盖不能更改声明的参数类型:
class Base{
protected abstract void printResults(Object abc);
}
...
class BaseImpl{
protected void printResults(String abc) {
...
}
}
这里BaseImpl有两个方法printResults()。
如果在BaseImpl方法中添加@Override,编译会失败,因为不是同一个方法:
class Base{
protected abstract void printResults(Object abc);
}
...
class BaseImpl{
@Override
protected void printResults(String abc) {
...
}
}
回答你的问题,如果void printResults(String abc)
是针对单个class的,只在这个class.
中添加这个方法
在这种情况下,您无法通过接口编程来调用此方法,因为此方法特定于 class.
但如果方法是具体的,那是可以接受的,有时甚至是可取的。
另一种解决问题的方法是使用泛型方法创建一个基础 class,根据具体 class,参数可能具有不同的类型,使用泛型:
class Base <T>{
protected abstract void printResults(T abc);
}
...
class BaseStringImpl<String>{
@Override
protected void printResults(String abc) {
...
}
}
...
class BaseIntegerImpl<Integer>{
@Override
protected void printResults(Integer abc) {
...
}
}
我有一个超级 class SheetBuilder 和许多继承此 class 的子 classes。 super class 有一个所有 classes 继承的抽象方法。
protected abstract void printResults(String abc);
现在我想用不同的参数重载相同的方法,但我只需要对一个子程序执行此操作 class。所以我改变了抽象方法如下,
protected abstract void printResults(Object abc);
这样我就可以用我想要接收的任何对象类型来实现我的子 class,
子 class 实现:
protected void printResults(int abc) {
//
}
这是正确的标准吗?还有其他方法可以实现吗?
protected abstract void printResults(Object abc);
Now I want to overload the same method with a different parameter but I need to do this only for one sub class. So I changed the abstract method as below, Is this the correct standard or this there any other way to achieve this?
不,对象太宽。从客户端,如果你想通过接口编程,你必须调用这个 printResults(Object abc);
.
你可以把任何类型的实例放在里面。
此外,我认为您混合了覆盖和重载。这是重载而不是覆盖,因为覆盖不能更改声明的参数类型:
class Base{
protected abstract void printResults(Object abc);
}
...
class BaseImpl{
protected void printResults(String abc) {
...
}
}
这里BaseImpl有两个方法printResults()。
如果在BaseImpl方法中添加@Override,编译会失败,因为不是同一个方法:
class Base{
protected abstract void printResults(Object abc);
}
...
class BaseImpl{
@Override
protected void printResults(String abc) {
...
}
}
回答你的问题,如果void printResults(String abc)
是针对单个class的,只在这个class.
中添加这个方法
在这种情况下,您无法通过接口编程来调用此方法,因为此方法特定于 class.
但如果方法是具体的,那是可以接受的,有时甚至是可取的。
另一种解决问题的方法是使用泛型方法创建一个基础 class,根据具体 class,参数可能具有不同的类型,使用泛型:
class Base <T>{
protected abstract void printResults(T abc);
}
...
class BaseStringImpl<String>{
@Override
protected void printResults(String abc) {
...
}
}
...
class BaseIntegerImpl<Integer>{
@Override
protected void printResults(Integer abc) {
...
}
}