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类。
泛型类在这方面会有什么帮助吗?
答案 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()方法调用。