Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 抽象类需要访问子类属性_Java_Abstract Class - Fatal编程技术网

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
implement
IterableSeveral人(注释中的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;}
  ...
}