2

片段#1:

public abstract class SuperClass {
    protected int i;   
}

public class SubClass extends SuperClass {
    public void method() {
        i = doAnythingWithI(i); // for example
    }
}

片段#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
    }
}

为什么要使用一个片段而不是另一个片段?最常见的处理方式是什么?

4

1 回答 1

1

抽象类最常见的用途之一是拥有不在抽象类中实现的抽象方法,而是在 java 程序的子类中实现。这显然不是您的用例。但是,抽象类也可以用作防止某人实例化应该首先扩展的类的一种方式。我假设这是你的愿望。

此外,我假设该示例的琐碎性质仅用于说明。否则,可能会怀疑有两个类来“管理”单个原始“ int”!

鉴于此和两个选择,片段 #2 更接近正确。原因是“类型”希望封装状态、​​数据和行为。Snippet #1 违反了这一点,通常会被劝阻。

不过,“doAnythingWithI”方法引发了讨论。您的示例中并未真正声明它。如果它仅对“i”进行操作并且不受具体类的更改,那么它也属于抽象基类。

如果它可以随着扩展超类的多个实现而变化,那么它可能应该被定义为超类中的抽象方法并由子类实现。

于 2013-08-19T16:42:45.003 回答