我需要制作几个不同类的集合。在我看来,子类继承自更通用的超类。所以我有类SuperClass,它目前有一个Object类型的成员变量o,它将采用子类SubClassA和类SubClassB之一的单个实例。 SubClassA和SubClassB有一些共同点,例如需要创建数据库表来保存自己的描述。因此,每个子类都需要有一个CreateDatabaseTables()方法。目前我有一个SuperClass实例的集合,每个实例都包含一个Object o,它可以是我在编译时不会知道的几个类之一。也许这不是最好的方法......
我的问题是,当我遍历集合时,我能够调用类似
的内容for (int i = 0; i < superClassArray.size; i++)
{
superClassInstance[i].o.CreateDatabaseTables();
}
无需将Object o转换为其中一个SubClasses?
或者我对整件事情进行了调整,我只是做错了吗?这个概念被称为继承,还是其他什么?我不认为它是继承,因为我不打算在SuperClass中编写CreateDatabaseTables()方法。每个班级都必须有自己的方法。
答案 0 :(得分:4)
你不是使用继承,而是使用组合。
您不需要基类中的成员:
abstract class SuperClass
{
public abstract void CreateDatabaseTables();
}
class SubClassA extends SuperClass
{
public void CreateDatabaseTables() { /*do whatever*/ }
}
class SubClassB extends SuperClass
{
public void CreateDatabaseTables() { /*do whatever else*/ }
}
只需在基类上调用overriden方法:
// Collection<SuperClass> superClassInstance;
// you can populate superClassInstance with objects of type
// SubClassA or SubClassB
for (int i = 0; i < superClassInstance.length; i++)
{
superClassInstance[i].CreateDatabaseTables();
}
答案 1 :(得分:0)
您需要在CreateDatabaseTables
中将SuperClass
定义为抽象方法,并将o
定义为Object
,而不是SuperClass
。
但是,我觉得你对o
成员变量做错了 - 当超类需要一个子类作为成员时,这不是常见的情况。
答案 2 :(得分:0)
就个人而言,我会使用接口而不是继承
http://docs.oracle.com/javase/tutorial/java/concepts/interface.html
答案 3 :(得分:0)
您可以拥有一个使用方法createDatabaseTables()
而不是Object的接口。更好的方法是让你的对象拥有这种方法,而不是直接访问该字段。
答案 4 :(得分:0)
如果你从不实例化超类,那么把它变成抽象的,
public abstract class MySuperClass {
public abstract void createDatabaseTables();
}
public class Child extends MySuperClass {
public abstract void createDatabaseTables(){
//bleh
}
}
然后所有的实施者都会自己实现它,你可以在你的情况下访问它。
答案 5 :(得分:0)
...关于
我的问题是,当我遍历集合时,我能够 打电话给
for (int i = 0; i < superClassArray.size; i++) { superClassInstance[i].o.CreateDatabaseTables(); }
无需将Object o转换为其中一个SubClasses?
您必须对该Object进行强制转换才能识别SubClass。