0

我正在尝试利用父类在多个继承类中重用,但父类需要有一个实例变量才能工作。

public class Num {
    private int a = 1;

    public int calc() {
        int c = a + 4;
        return c;
    }
}

public class Two extends Num {
    private int a = 2;
}

每个子类之间的主要区别在于它们的实例变量的值。有没有办法让 Two 仍然可以使用泛型类 Num 中的 calc() 代码,而无需简单地通过将“a”参数设置为它自己的值来覆盖它,或者我是否以完全错误的方式来解决这个问题?

4

4 回答 4

1

只是一个技巧,将 a 作为输入参数传递给该方法应该可以帮助您:

   public int calc(int a) {
        int c = a + 4;
        return c;
    }

我认为即使你不这样做,那么 usingthis应该使用调用对象的 a 的值:

public int calc() {
    int c = this.a + 4;
    return c;
}
于 2013-08-11T06:57:44.740 回答
1

将“a”的初始化放在构造函数中并使其受到保护:

public class Num {
    protected int a;

    public Num() { a = 1; }

    public int calc() {
        int c = a + 4;
        return c;
    }
}

public class Two extends Num {
    public Two() { a = 2; }
}
于 2013-08-11T06:59:39.880 回答
0

添加受保护的 getter a,然后它将类似于模板方法:

public class Num {
        public int calc() {
            int c = getA()+ 4;
            return c;
        }

        protected int getA() {
            return 1;
        }
    }

    static class Two extends Num {
        @Override
        protected int getA() {
            return 2;
        }
    }
于 2013-08-11T07:06:20.167 回答
0

使aprotected 不是最封装的方法。如果将初始化放在thena的构造函数中,也可以调用该构造函数。重用它的逻辑。NumTwo

public class Num {
    private final int a;

    public Num(int a) { 
        this.a = a; 
    }

    public int calc() {
        return a + 4;
    }
}

public class Two extends Num {
    public Two(int a) {
        super(a);
    }
}
于 2013-08-11T08:42:01.663 回答