Java继承。。。我想。也许不是

Java继承。。。我想。也许不是,java,inheritance,Java,Inheritance,我需要收集几个不同的类。在我看来,子类继承自更一般的超类。所以我有一个超类,它当前有一个对象类型的成员变量o,它将获取子类subassa和子类b中的一个实例。子类A和子类B有一些共同点,比如需要创建数据库表来保存它们自己的描述。因此,每个子类都需要一个方法CreateDatabaseTables()。目前我有一个超类实例的集合,每个实例都包含一个对象o,它可以是我在编译时不知道的几个类中的一个。也许这不是最好的方法 我的问题是,当我迭代集合时,我是否能够调用 for (int i = 0; i

我需要收集几个不同的类。在我看来,子类继承自更一般的超类。所以我有一个超类,它当前有一个对象类型的成员变量o,它将获取子类subassa和子类b中的一个实例。子类A和子类B有一些共同点,比如需要创建数据库表来保存它们自己的描述。因此,每个子类都需要一个方法CreateDatabaseTables()。目前我有一个超类实例的集合,每个实例都包含一个对象o,它可以是我在编译时不知道的几个类中的一个。也许这不是最好的方法

我的问题是,当我迭代集合时,我是否能够调用

for (int i = 0; i < superClassArray.size; i++)
{
  superClassInstance[i].o.CreateDatabaseTables();
}
for (int i = 0; i < superClassArray.size; i++) {  
   superClassInstance[i].o.CreateDatabaseTables(); 
} 
for(int i=0;i
不必将对象o强制转换为其中一个子类


还是我把整件事搞砸了,只是做错了?这个概念叫继承,还是别的什么?我不认为这是继承,因为我不打算在超类中编写CreateDatabaseTables()方法。每个类都必须有自己的方法。

您需要将
CreateDatabaseTables
定义为
超类中的抽象方法,并将
o
定义为非
对象,而是
超类


但是,,我觉得您在使用
o
成员变量时出错了-当一个超类需要有一个子类作为成员时,这种情况并不常见。

您需要将
CreateDatabaseTables
定义为
超类中的抽象方法,并将
o
定义为非
对象,而是一个
超类


但是,我觉得您对
o
成员变量做了一些错误的事情-当一个超类需要有一个子类作为成员时,这不是一种常见的情况。

就我个人而言,我会使用接口而不是继承


就我个人而言,我会使用接口而不是继承


您可以有一个接口,该接口具有方法
createDatabaseTables()
,您可以使用该方法而不是对象。更好的方法是使对象具有此方法,而不是直接访问字段。

您可以拥有一个接口,该接口具有方法
createDatabaseTables()
,您可以使用该方法来代替对象。更好的方法是使对象具有此方法,而不是直接访问字段。

如果从不实例化超类,则将其抽象

public abstract class MySuperClass {
    public abstract void createDatabaseTables();
}

public class Child extends MySuperClass {
       public abstract void createDatabaseTables(){
              //bleh
       }
}

然后所有的实现者将自己实现它,在您的情况下,您将有权访问它。

如果您从未实例化过超类,请将其抽象化

public abstract class MySuperClass {
    public abstract void createDatabaseTables();
}

public class Child extends MySuperClass {
       public abstract void createDatabaseTables(){
              //bleh
       }
}

然后所有的实现者将自己实现它,在您的情况下您将可以访问它。

您使用的不是继承,而是组合

基类中不需要成员:

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*/ }
}
// 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();
}
只需在基类上调用重写的方法:

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*/ }
}
// 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();
}
//集合超类实例;
//您可以使用类型为的对象填充superClassInstance
//子类A或子类B
对于(int i=0;i
您使用的不是继承,而是组合

基类中不需要成员:

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*/ }
}
// 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();
}
只需在基类上调用重写的方法:

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*/ }
}
// 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();
}
//集合超类实例;
//您可以使用类型为的对象填充superClassInstance
//子类A或子类B
对于(int i=0;i
关于

我的问题是,当我迭代集合时,我是否能够 打电话给

for (int i = 0; i < superClassArray.size; i++)
{
  superClassInstance[i].o.CreateDatabaseTables();
}
for (int i = 0; i < superClassArray.size; i++) {  
   superClassInstance[i].o.CreateDatabaseTables(); 
} 
for(inti=0;i
不必将对象o强制转换为其中一个子类

您必须对该对象进行强制转换才能识别子类。

关于

我的问题是,当我迭代集合时,我是否能够 打电话给

for (int i = 0; i < superClassArray.size; i++)
{
  superClassInstance[i].o.CreateDatabaseTables();
}
for (int i = 0; i < superClassArray.size; i++) {  
   superClassInstance[i].o.CreateDatabaseTables(); 
} 
for(inti=0;i
不必将对象o强制转换为其中一个子类


为了识别子类,您必须对该对象进行强制转换。

您的意思是说
以及继承
没有继承的接口不是很有用。

你的意思是没有继承的接口不太有用吗超级类不应该依赖于它的子类。您的设计已损坏,应予以修复。我怀疑你过于依赖继承来解决那些不需要继承来解决的问题,而应该通过组合来解决。一个超类不应该依赖于它的子类。您的设计已损坏,应予以修复。我怀疑你过于依赖继承来解决不需要继承来解决的问题,但是应该通过组合来解决。为什么必须将
CreateDatabaseTables
定义为抽象?因为
SuperClass
本身没有此方法的实现。为什么必须将
CreateDatabaseTables
定义为抽象?因为
SuperClass
本身没有实现这种方法的优点。完美!谢谢你,路钦。我已经知道这会更好。@Luchian-我试图编辑这篇文章来纠正几个Java语法错误,但被拒绝了(见图)。1.如果一个类中有一个抽象方法,那么整个类都需要