繁体   English   中英

Java:如何通过调用父类的子类获取对象

[英]Java: How to get the object of a subclass by calling it's parent class

import java.util.*;
import java.lang.*;
import java.io.*;

class mainA {
   private mainA obj;

public mainA(int type) {
  System.out.println("accessing mainA");
  switch(type) {
     case 1:
        obj = new mysql();
        break;

     case 2:
        obj = new mssql();
        break;

     default:
        break;
   }
  }
}

class mysql extends mainA {
  public void printme() {
    System.out.println("accessing mysql");
  } 
}

class mssql extends mainA {
  public void printme() {
    System.out.println("accessing mssql");
  }
}

class C2 extends mainA {

   public C2() {
      super();
   }
   public static void main(String args[]){
      Object b = new C2();
      b.printme();
   }
 }

我需要实现以下方案。 如果有人可以帮助我,那就太好了。 我正在尝试创建一个通用的API库集,该库集可以扩展到尽可能多的后端数据库。

这个想法是创建一个C2对象,该对象又将基于dbtype返回mysql / mssql的值。 可以从代码中的任何位置获取type参数。 mainA是由配置参数组成的超类。 类型也可以在这里获得。 这里的问题是我无法从C2获取mysql / mssql的对象。 理想的情况是创建一个引用mainA的C2对象,该对象获取类型并启动mssql / mysql。 C2.printme必须调用在类型中指定的db类。

泛型类在这里有帮助吗?

您可以有一个instanceof测试来强制转换对象,但这很la脚,因为如果要添加新类型的DB对象,则必须更改代码。

您可以拥有一个良好的接口并使子类实现它,以便您可以通过接口进行调用而无需关心实际的实现对象。

对接口进行编码是您应该做的。

您还需要做一些工作。 您将需要阅读接口。 在您的示例中,您可以执行以下操作(在现实世界中这有点愚蠢)。

我们将其称为Printable.java接口(按照约定,以大写字母“ I”开头或以“ -ible”,“ able”等结尾)。 我不会真正将其称为Printable,但出于此示例的目的:

public interface Printable {
   public void logDatabaseType();
}

您的父类(我们可以使其抽象化,以便没有基础实现就不能直接创建它):

public abstract class Database implements Printable {
    @Override
    public void logDatabaseType() {
        System.out.println("logDatabaseType()");
    }
}    

您的子类:

public class MySQL extends Database implements Printable {
    @Override
    public void logDatabaseType() {
       System.out.println("Accessing MySQL");
    }
}

public class MicrosoftSQL extends Database implements Printable {
    @Override
    public void logDatabaseType() {
       System.out.println("Accessing MSSQL");
    }
}

在测试课中(您应该尽早使用JUnit进行尝试):

 public class DatabaseLogTest {

   @Test
   public void printDatabaseType() {
       //programming by interface
       Printable printable = new MySql();         
       printable.logDatabaseType();

       printable = new MicrosoftSQL();
       printable.logDatabaseType();

       //then later you can do 
       //someMethod(printable);
       //and the printable object will retain whatever was instantiated
       //and someMethod will be blissfully ignorant of the actual implementation
    } 

}

@Override很重要,因为它告诉您的IDE和开发人员您正在重写实现,并且如果不符合隐含的约定,则IDE将吐出错误。 每次覆盖时都应具有此功能。

您还希望使用记录器(例如,通过Log4J或Slog4J的SLF4j)而不是System.out.println()方法调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM