我正在尝试理解在Java中扩展内部类。我已经到处看过了,但没有一个能完全回答我的问题。所以开始吧..。
我有。
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**
}
}
}然后我扩展这个..。
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方法时,就像这样...
ApplePie ap = new ApplePie(8);
System.out.println(ap.toString());我没有得到关于苹果派切片的信息,但得到了关于馅饼切片的信息。它忽略我的toString覆盖,或者更可能忽略我的苹果派Slice。我如何安排它使苹果派切片引用ApplePie?
任何帮助都非常感谢!很抱歉对饼的引用-这是我正在使用的实际类...
发布于 2013-01-26 14:36:16
我已经更改了您的代码以满足您的要求。
您的超类Pie即将创建Slice的新实例,但是子类ApplePie的Slice没有覆盖其超类‘的Slice方法。
我添加了下面的函数,使子类能够创建自己的Slice。
protected void newSliceArray(int n) {
slices = new Slice[n];
}
protected Slice newSlice(float startAngle) {
return new Slice(startAngle);
}Pie.java:
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:
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 + "";
}
}
}测试:
public static void main(String[] args) {
ApplePie ap = new ApplePie(8);
System.out.println(ap.toString());
}代码将打印22222222
发布于 2013-01-26 14:30:51
在您的超类中,您正在创建和存储Pie.Slice对象:
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()没有返回任何东西--它甚至不应该被编译:
@Override
public String toString(){
for (Slice s:slices){
s.toString();
}
}我猜你想要返回一个代表所有切片的字符串。这将是一个快速的解决方案,例如:
@Override
public String toString() {
return Arrays.toString(slices);
}(Arrays.toString只是一个获取表示数组的字符串的实用方法。)
发布于 2013-01-26 14:41:23
答案就在你的程序中。当您实例化Slice类时,它会调用超类并调用sliceGenerator。此方法在内部创建Pie.Slice而不是ApplePie.Slice的实例。要解决此问题,请在Apple.Slice类中保护sliceGenerator方法并覆盖它。创建Apple.Slice的实例,它就可以工作了。
https://stackoverflow.com/questions/14534421
复制相似问题