首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:扩展内部类

Java:扩展内部类
EN

Stack Overflow用户
提问于 2013-01-26 14:15:04
回答 3查看 18.1K关注 0票数 10

我正在尝试理解在Java中扩展内部类。我已经到处看过了,但没有一个能完全回答我的问题。所以开始吧..。

我有。

代码语言:javascript
复制
public class Pie{
    protected Slice[] slices;

    // Pie constructor
    public Pie(int n){
         sliceGenerator(n)
    }

    private void sliceGenerator(int n){
         slices = new Slice[n];
         final float sweepAngle = 360.0f/(float)n;
         float startAngle = 0;
         for (int i=0;i<n;i++){ 
             slices[i] = new Slice(startAngle);
             startAngle += sweepAngle;
         }
    }

    @Override
    public String toString(){
         for (Slice s:slices){  
             s.toString();
         }
    }

    // Inner class...
    public class Slice{
        public Slice(float startAngle){
             //set some private fields based on startAngle and generic pie 
        }

        @Override
        public String toString(){
             return **string based on private fields**
        }
    }
}

然后我扩展这个..。

代码语言:javascript
复制
public class ApplePie extends Pie{
    protected Slice[] slices;

    // Apple Pie constructor
    public ApplePie(int n){
         super(n);
    }

    // Inner class...
    public class Slice extends Pie.Slice{
        public Slice(float startAngle){
            super(startAngle);
            //set some **additional** private fields based on startAngle **specific to apple pie** appleness or something
        }

        @Override
        public String toString(){
             return **string based on apple pie specific private fields**
        }
    }
}

现在,当我做一个苹果派并调用它的toString方法时,就像这样...

代码语言:javascript
复制
ApplePie ap = new ApplePie(8);
System.out.println(ap.toString());

我没有得到关于苹果派切片的信息,但得到了关于馅饼切片的信息。它忽略我的toString覆盖,或者更可能忽略我的苹果派Slice。我如何安排它使苹果派切片引用ApplePie

任何帮助都非常感谢!很抱歉对饼的引用-这是我正在使用的实际类...

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-26 14:36:16

我已经更改了您的代码以满足您的要求。

您的超类Pie即将创建Slice的新实例,但是子类ApplePie的Slice没有覆盖其超类‘的Slice方法。

我添加了下面的函数,使子类能够创建自己的Slice

代码语言:javascript
复制
protected void newSliceArray(int n) {
    slices = new Slice[n];
}

protected Slice newSlice(float startAngle) {
    return new Slice(startAngle);
}

Pie.java:

代码语言:javascript
复制
public class Pie {
  private int a = 1;
  protected Slice[] slices;

  // Pie constructor
  public Pie(int n) {
    sliceGenerator(n);
  }

  private void sliceGenerator(int n) {
    newSliceArray(n);
    final float sweepAngle = 360.0f / n;
    float startAngle = 0;
    for (int i = 0; i < n; i++) {
      slices[i] = newSlice(startAngle);
      startAngle += sweepAngle;
    }
  }

  protected void newSliceArray(int n) {
    slices = new Slice[n];
  }


  protected Slice newSlice(float startAngle) {
    return new Slice(startAngle);
  }

  @Override
  public String toString() {
    String t = "";
    for (Slice s : slices) {
      t += s.toString();
    }
    return t;
  }

  // Inner class...
  public class Slice {
    public Slice(float startAngle) {
      // set some private fields based on startAngle and generic pie
    }

    @Override
    public String toString() {
      return "" + a;
    }
  }
}

ApplePie.java:

代码语言:javascript
复制
public class ApplePie extends Pie {
  private int b = 2;

  // protected Slice[] slices;

  // Apple Pie constructor
  public ApplePie(int n) {
    super(n);
  }

  protected void newSliceArray(int n) {
    slices = new Slice[n];
  }

  protected Slice newSlice(float startAngle) {
    return new Slice(startAngle);
  }

  // Inner class...
  public class Slice extends Pie.Slice {
    public Slice(float startAngle) {
      super(startAngle);
      // set some **additional** private fields based on startAngle **specific to apple pie**
      // appleness or something
    }

    @Override
    public String toString() {
      return b + "";
    }
  }
}

测试:

代码语言:javascript
复制
public static void main(String[] args) {
    ApplePie ap = new ApplePie(8);
    System.out.println(ap.toString());
}

代码将打印22222222

票数 6
EN

Stack Overflow用户

发布于 2013-01-26 14:30:51

在您的超类中,您正在创建和存储Pie.Slice对象:

代码语言:javascript
复制
private void sliceGenerator(int n){
     slices = new Slice[n];
     final float sweepAngle = 360.0f/(float)n;
     float startAngle = 0;
     for (int i=0;i<n;i++){ 
         slices[i] = new Slice(startAngle);
         startAngle += sweepAngle;
     }
}

这些对象与Pie.toString使用的对象相同(顺便说一句,ApplePie不会覆盖这些对象)。

ApplePie扩展Pie和用ApplePie.Slice扩展Pie.Slice不会改变这一点。上面代码中的new Slice(startAngle)不会神奇地切换到实例化不同的东西。

除此之外,你的Pie.toString()没有返回任何东西--它甚至不应该被编译:

代码语言:javascript
复制
@Override
public String toString(){
     for (Slice s:slices){  
         s.toString();
     }
}

我猜你想要返回一个代表所有切片的字符串。这将是一个快速的解决方案,例如:

代码语言:javascript
复制
@Override
public String toString() {
     return Arrays.toString(slices);
}

(Arrays.toString只是一个获取表示数组的字符串的实用方法。)

票数 3
EN

Stack Overflow用户

发布于 2013-01-26 14:41:23

答案就在你的程序中。当您实例化Slice类时,它会调用超类并调用sliceGenerator。此方法在内部创建Pie.Slice而不是ApplePie.Slice的实例。要解决此问题,请在Apple.Slice类中保护sliceGenerator方法并覆盖它。创建Apple.Slice的实例,它就可以工作了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14534421

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档