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

时间:2014-10-24 17:56:40

标签: java mysql

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的值。可以从代码中的任何位置获取类型参数。 mainA是由class params组成的超类。类型也可以在这里获得。这里的问题是我无法从C2获取mysql / mssql的对象。理想的情况是创建一个C2对象,它指的是获取类型的mainA,并且可以是mssql / mysql。 C2.printme必须调用类型中指定的db类。

泛型类在这方面会有什么帮助吗?

2 个答案:

答案 0 :(得分:1)

你可以通过instanceof测试来强制转换对象,但是如果要添加新类型的DB对象,则必须更改代码。

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

  

编码到接口是你应该做的。

答案 1 :(得分:0)

你前面有一些工作要做。您将要阅读界面。在您的示例中,您可以执行以下操作(在现实世界中它有点愚蠢)。

让我们调用我们的接口Printable.java(按照惯例,以大写字母" I"或以" -ible","结束,"等)。我不会把它称为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将吐出错误。只要你重写,你就应该拥有这个。

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