我想创建一组共享许多常见行为的类。当然,在OOP中,当你认为自动思考“带有子类的抽象类”时。但是我希望这些类所要做的事情是每个类都有一个静态的类实例列表。该列表应该在类中作为一个单例。我的意思是每个子类都有一个单身人士,而不是他们分享一个。 “单身”到那个小类,不是一个真正的单身人士。但如果它是静态的,我该如何继承它?我如何制作一个单身家庭?
当然像这样的代码将无法正常工作:
public abstract A
{
static List<A> myList;
public static List getList()
{
if (myList==null)
myList=new ArrayList<A>(10);
return myList;
}
public static A getSomethingFromList()
{
List listInstance=getList();
... do stuff with list ...
}
public int getSomethingFromA()
{
... regular code acting against current instance ...
}
}
public class A1 extends A
{
...
}
public class A2 extends A
{
...
}
A1 somethingfromA1List=(A1) A1.getSomethingFromList();
A2 somethingfromA2List=(A2) A2.getSomethingFromList();
每个子类的列表中的内容会有所不同,但所有的代码在名单的工作将是相同的。
上述代码的问题是,我只有一个列表的所有子类,我想为每个。是的,我可以复制代码来在每个子类中声明静态列表,但是我还必须复制添加到列表中的所有代码并搜索列表等,这相当于破坏了子类化的目的。
有关如何在不复制代码的情况下执行此操作的任何想法?
更新
澄清BlueRaja,也许别人,让我成为一个更具体一点什么,我试图做的。
我有一些需要类似行为的状态和代码。它们就像枚举一样,我希望为每个可能的代码状态提供类型安全的实例,但是它们有多个集合,所以我不能只为它们制作一个枚举。
因此,例如我有订单状态,它具有按顺序,发货,收到的值和一些特殊值。我有物品类型,商品与服务的价值。我有股票与习俗。等
如果这就是它,我只是为每个枚举。但是,我还需要其他行为,例如通过文本值查找对象的能力,例如,当我们从数据库中读取它时;建立一个下拉列表,通过文字描述列出所有的选择;等等。据我所知,我不能用枚举来做这件事,因为我有几组代码,每个代码都有我想要继承的常见行为,并且我不能继承一个枚举。将所有代码放在一个枚举中会放弃一个代码相对于另一个代码的类型安全性,也没有证明为特定代码类型收集值列表的现成方法。
不要在对象orietented世界中使用静态持有状态,这只是错误的。 – 2010-05-03 13:53:10
不要使用单例,对静态数据要非常小心。比继承更喜欢构图。 真的,你提到的几乎没有什么是真正的“良好的面向对象”。 – jalf 2010-05-03 14:00:32
好的。所以我有一组给定子类的实例,并且我需要维护一个所有这些实例的列表以供搜索,构建下拉列表等。好的,我可以创建一个包含列表的(非静态)对象。但只有一个列表才有意义。那有什么好处呢?如果我用不同的列表创建两个对象,那么有些事情是错误的。如果没有单身人士,你会如何解决问题? – Jay 2010-05-03 16:48:45