Java 抽象类需要访问子类属性
我的代码有问题(编辑:这些类的全部代码)Java 抽象类需要访问子类属性,java,abstract-class,Java,Abstract Class,我的代码有问题(编辑:这些类的全部代码) 公共抽象类SimplePolygon实现多边形{ //受保护的Vertex2D[]varray;//这在测试中是错误的 公共双getWidth(){ double min=varray[0].getX(),max=varray[0].getX(); 对于(inti=0;i想想: 您的Polygon接口为java.util.List接口 您的SimplePoygon抽象类为java.util.AbstractCollection 您的ArrayPolyg
公共抽象类SimplePolygon实现多边形{
//受保护的Vertex2D[]varray;//这在测试中是错误的
公共双getWidth(){
double min=varray[0].getX(),max=varray[0].getX();
对于(inti=0;i想想:
- 您的
Polygon
接口为java.util.List
接口
- 您的
SimplePoygon
抽象类为java.util.AbstractCollection
- 您的
ArrayPolygon
具体类为java.util.ArrayList
我认为您的任务的重点是使用迭代器实现一个解决方案,这样您就可以在抽象类中实现关于多边形的通用方法,同时在具体类中隐藏包含数据点的实际数据结构;因此:
/*
* This class implements generic methods about polygon, like size, area and
* so on, leveraging on the Vertex2D iterator.
*/
public abstract class SimplePolygon implements Polygon {
// all concrete subclasses must implement iterator
public abstract Iterator<Vertex2D> iterator();
// this generic method prints the vertex list
// using iterator hides the data structure used in implementation
public String toString() {
Iterator<Vertex2D> it = iterator();
if (! it.hasNext())
return "[]";
StringBuilder sb = new StringBuilder();
sb.append('Polygon: vertices = [');
for (;;) {
Vertex2D e = it.next();
if (! it.hasNext())
return sb.append("]").toString();
sb.append(' ');
}
}
}
// for instance this concrete classes uses an ArrayList
public ArrayPolygon extends SimplePolygon {
public Iterator<Vertex2D> iterator() {
return new .....
}
}
/*
*此类实现有关多边形的通用方法,如大小、面积和形状
*依此类推,利用Vertex2D迭代器。
*/
公共抽象类SimplePolygon实现多边形{
//所有具体的子类都必须实现迭代器
公共抽象迭代器迭代器();
//此通用方法打印顶点列表
//使用迭代器隐藏实现中使用的数据结构
公共字符串toString(){
迭代器it=迭代器();
如果(!it.hasNext())
返回“[]”;
StringBuilder sb=新的StringBuilder();
sb.append('多边形:顶点=[');
对于(;;){
vertex2de=it.next();
如果(!it.hasNext())
返回sb.append(“]”).toString();
某人附加(“”);
}
}
}
//例如,此具体类使用ArrayList
公共ArrayPolygon扩展了SimplePolygon{
公共迭代器迭代器(){
返回新的。。。。。
}
}
首先,这个问题与toString()
无关
您的问题似乎是“如何从子类初始化varray
?”
一种方法是在超类中创建构造函数:
public abstract class SimplePolygon implements Polygon {
protected SimplePolygon(int size) {
varray = new Vertex2D[size]; // initialization by super class
}
protected SimplePolygon() {} // initialization totally by subclass
}
然后调用子类中的构造函数:
public class ArrayPolygon extends SimplePolygon {
public ArrayPolygon(Vertex2D[] array) {
varray = array; // use default constructor and initialize it from parameter
}
}
没有传入数组的其他子类可以调用特殊构造函数:
public class Square extends SimplePolygon {
public Square() { // probably pass them in too
super(4); // we know there's 4 vertices
}
}
这个问题很笼统,似乎有点无意义-不清楚练习的目标是什么。如果需要访问子类变量,可以通过强制子类通过方法公开该变量来公开该变量
public abstract class SimplePolygon implements Polygon {
protected abstract Vertex2D[] getArray();
...
public String toString(){
String str = "Polygon: vertices =";
Vertex2D[] varray = getArray();
for(int i = 0;i<varray.length;i++){
str += " ";
str += varray[i];
}
return str;
}
公共抽象类SimplePolygon实现多边形{
受保护的抽象Vertex2D[]getArray();
...
公共字符串toString(){
String str=“Polygon:vertices=”;
Vertex2D[]varray=getArray();
对于(int i=0;i我终于意识到问题在哪里。答案很简单…在SimplePolygon类中将方法getVertex和getNumVertices声明为抽象就足够了。这两个方法从varray提供了更多足够的信息。所以整个技巧就是更改varray.length和varray[n]感谢您的时间和帮助。将大小放在抽象构造函数中,让子类在构造时调用它怎么样?在子类中实现toString()
,或者在SimplePolygon
中调用toString()
中的其他abstract
方法。您是什么意思“初始化varray”?您的toString()
方法的相关性是什么?发布抽象类的完整最终代码;指定作业中包含的内容以及您自己添加的内容。似乎您误解了作业,或者此作业只是垃圾。试着使用反射设置属性“varray”“在您的抽象类中。实际上,这可以在没有抽象方法的情况下完成。(好吧,不在代码中指定它,但它可能只满足赋值约束。)使SimplePolygon
implementIterableSeveral人(注释中的me、guido、jlordo)我给了你一个答案,其中包括添加你拒绝的抽象方法,而有人投了反对票。接受其中一个答案,而不是发布与你收到的答案基本相同(但内容较轻)的答案,这才是公平的。对不起,我的第一个问题……我真的想告诉大家
public abstract class SimplePolygon implements Polygon {
protected abstract Vertex2D[] getArray();
...
public String toString(){
String str = "Polygon: vertices =";
Vertex2D[] varray = getArray();
for(int i = 0;i<varray.length;i++){
str += " ";
str += varray[i];
}
return str;
}
public class ArrayPolygon extends SimplePolygon
{
private Vertex2D[] varray;
public ArrayPolygon(Vertex2D[] array){
super(array.length);
varray = new Vertex2D[array.length];
if (array == null){}
for(int i = 0;i<array.length;i++){
if (array[i] == null){}
varray[i] = array[i];
}
@Override
protected Vertex2D[] getArray() {return varray;}
...
}