Snippet#1:
public abstract class SuperClass {
protected int i;
}
public class SubClass extends SuperClass {
public void method() {
i = doAnythingWithI(i); // for example
}
}
Snippet#2:
public abstract class SuperClass {
private int i;
protected int getI() {
return i;
}
protected int setI(int i) {
this.i = i;
}
}
public class SubClass extends SuperClass {
public void method() {
setI(doAnythingWithI(getI())); // for example
}
}
使用一个代码段而不是另一个代码段的原因是什么?最常用的处理方式是什么?
答案 0 :(得分:1)
抽象类的一个更常见的用途是使抽象方法不在抽象类中实现,而是在java程序的子类中实现。这显然不是你的用例。但是,抽象类也可以用作防止某人实例化应该首先扩展的类的方法。我假设这是你的愿望。
此外,我认为这个例子的琐碎本质仅仅是为了说明。有两个类“管理”单个原语'int'可能会被怀疑!
鉴于此,两个选择Snippet#2更接近正确。这是因为需要“类型”来封装状态,数据和行为。片段#1违反了这一点,通常会气馁。
方法“doAnythingWithI”虽然引起了讨论。在您的示例中并未真正声明它。如果它仅在“i”上运行并且不受具体类的改变,那么它也属于抽象基类。
如果它可以随着扩展SuperClass的多个实现而变化,那么它应该被定义为SuperClass中的抽象方法并由子类实现。