假设我有一个抽象类List
,我想创建一个扩展名为MyList
的类的类。在抽象类中放置抽象getter和setter是不是很糟糕的编程习惯,迫使MyList
覆盖它们?
我想要这样做的原因就像为List
的每个专业化设置不同的容量。所以我会做这样的事情:
public abstract class List {
public abstract int getMaximumSize();
}
public class MyList extends List {
@Override
public int getMaximumSize() {
return 10;
}
}
我还有另一个例子,我把一个setter放在抽象类中,但现在我忘记了。
答案 0 :(得分:2)
IMO,这是一种合理的方法(模数设置器。不要用抽象,非抽象或任何其他类型的文件来设置。)
这里有一个问题 - 如果你班级的实施者是白痴,会发生什么?考虑
public abstract class List {
public abstract int getMaximumSize();
}
public class MyList extends List {
@Override
public int getMaximumSize() {
// negative?!?!
return -10;
}
}
如果你想避免这种情况,可以这样做:
public abstract class List {
// this is the method to override
protected abstract int getMaximumSizeInternal();
// and this method is final. Can't mess around with that!
public final int getMaximumSize() {
int x = getMaximumSizeInternal();
if (x < 0) { throw new RuntimeException ("Apologies, sub-classer is an idiot"); }
return x;
}
public class MyList extends List {
@Override
protected int getMaximumSizeInternal() {
// negative?!?!
return -10;
}
}
答案 1 :(得分:1)
在这种情况下,我会推荐一个界面,例如
public interface MaxList extends List // or some better name {
public int getMaxSize();
}
然后是MyList
public class MyList extends ArrayList implements MaxList {
// The above assumes you want to extend ArrayList. You may extend some other
// List implementation or provide your own.
@Override
public int getMaximumSize() {
return 10;
}
}
注意:我假设您要扩展java.util.List
的实现。如果不这样做,则MaxList
接口无需扩展java.util.List
或MyList以扩展java.util.ArrayList
答案 2 :(得分:0)
我认为如果你想让每个孩子都有getter \ setter是可以的。最终,如果它满足您的需求,那就没关系,我宁愿问是否有更好的方法来实现这种行为。