Java继承......我想。也许不吧

时间:2012-02-23 15:58:02

标签: java inheritance

我需要制作几个不同类的集合。在我看来,子类继承自更通用的超类。所以我有类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()方法。每个班级都必须有自己的方法。

6 个答案:

答案 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。