模板在需要实例变量时的类

时间:2013-08-11 06:55:28

标签: java oop

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

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;
}

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

4 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分: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; }
}

答案 2 :(得分:0)

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

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;
        }
    }

答案 3 :(得分:0)

使a受保护并不是最常用的封装方式。如果将a的初始化放在Num的构造函数中,那么Two也可以调用该构造函数。重用它的逻辑。

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);
    }
}