问题描述
我的任务是将给定的类转换为抽象和泛型类,生成泛型类型的值序列,并支持接受初始值的单个构造函数。
这是给定的类:
public class Progression {
protected long current;
public Progression(){
this.current=0;
}
public Progression(long start){
this.current=start;
}
public long nextValue(){
long answer= current;
advance();
return answer;
}
protected void advance(){
current++;
}
public void printProgression(int n){
System.out.println(nextValue());
for(int j=0;j<n;j++){
System.out.println(" "+nextValue());
}
System.out.println();
}
}
我做了这样的转换:
abstract class ReProgression<T> {
protected T current;
public ReProgression(T start){
current=start;
}
public T nextValue(){
T answer= current;
advance();
return answer;
}
public void advance(){
}
public void printProgression(int n){
System.out.println(nextValue());
for(int j=0;j<n;j++){
System.out.println(" "+nextValue());
}
System.out.println();
}
}
解决方法
可能的解决方案 1
进步是一个需要定义的术语。
在 Progression
的初始示例中,您正在推进 long
,因此很容易确定如何推进。只需增加数字。
当您将它从 long 转换为泛型类型时,您不再知道该类型是什么(因此是泛型),因此您必须以某种方式定义如何前进。泛型类型 T 必须 定义“前进”时的 bavious。在 Java 中执行此操作的标准方法是使用 接口
我会创造这样的东西 -
public interface Advancable{
public void advance();
}
在你的 ReProgression
类中,你会像这样使用这个接口 -
abstract class ReProgression<T extends Advancable> {
protected T current;
public ReProgression(T start){
current=start;
}
public T nextValue(){
T answer= current;
advance();
return answer;
}
public void advance(){
current.advance();
}
public void printProgression(int n){
System.out.println(nextValue());
for(int j=0;j<n;j++){
System.out.println(" "+nextValue());
}
System.out.println();
}
}
这就是解决方案。然而,我应该讨论如何调用代码。
在最初的示例 Progression
中,您可以像这样调用它,例如 -
Progression p = new Progression(1);
p.printProgression(5);
哪个会产生输出
1
2
3
4
5
要对 ReProgression
执行相同的操作,您可能会像这样调用它 -
MyAdvancable<Long> startValue = new MyAdvancable<Long>(5);
ReProgression rp = new ReProgression(startValue);
rp.printProgression(5);
但您还需要定义 MyAdvancable
可能的解决方案 2
你自己几乎就有了正确的答案。您的问题是“将给定的类转换为抽象的通用类”。声明类抽象只有在至少有一个 abstract method 时才有意义。通常这是因为在编写代码时不知道或定义行为。这听起来很像您的问题中评论的未知“推进”机制。所以你所拥有的几乎就是你的解决方案。只需删除 Advance() 方法的主体 -
abstract class ReProgression<T> {
protected T current;
public ReProgression(T start){
current=start;
}
public T nextValue(){
T answer= current;
advance();
return answer;
}
abstract void advance();
public void printProgression(int n){
System.out.println(nextValue());
for(int j=0;j<n;j++){
System.out.println(" "+nextValue());
}
System.out.println();
}
}
我有两个解决方案的原因是因为根据您的问题,并且没有更多关于您的书当前章节所涵盖的主题的背景知识,对我来说这两个解决方案中的任何一个都是可能的,您需要决定哪个如果有的话,这些可能是您的解决方案。祝您在学习 Java 的过程中一切顺利!