Интерфейс и возвращаемый тип в Java. Как быть? Есть код:public interface DfgDbAdaptee { public boolean checkTableExists(String tableName) throws DfgFatalException; } public class DfgDbSqliteAdapter implements DfgDbAdaptee { public boolean checkTableExists(String tableName) throws DfgFatalException { ..... } } public class DfgDbFMDBAdapter implements DfgDbAdaptee { public boolean checkTableExists(String tableName) throws DfgFatalException { ..... } } public class DfgDb { public static ??? Factory() { int dbType = DfgAppConfig.getDbType(); if (dbType == DfgAppConfig.DBTYPE_SQLITE){ return new DfgDbSqliteAdapter; }else if (dbType == DfgAppConfig.DBTYPE_FMDB){ return new DfgDbFMDBAdapter; } throw new DfgConfigException("Unknown db type in config"); } } //и гдето в коде вызываем: ??? db = DfgDb.Factory(); db.checkTableExists(new String("lalala"));
Собственно вопрос — как описать тип который в коде выше показан как три вопроса? Суть в том что Factory должен возвращать любой класс имеющий реализацию интферейса DfgDbAdaptee.
Для описания типа, который может быть одним из классов DfgDbSqliteAdapter или DfgDbFMDBAdapter, вы можете использовать тип интерфейса DfgDbAdaptee. Измените метод Factory() класса DfgDb следующим образом:
public class DfgDb { public static DfgDbAdaptee Factory() { int dbType = DfgAppConfig.getDbType(); if (dbType == DfgAppConfig.DBTYPE_SQLITE){ return new DfgDbSqliteAdapter; }else if (dbType == DfgAppConfig.DBTYPE_FMDB){ return new DfgDbFMDBAdapter; } throw new DfgConfigException("Unknown db type in config"); } }
Используйте тип DfgDbAdaptee для переменной, которая хранит результат вызова Factory():
DfgDbAdaptee db = DfgDb.Factory(); db.checkTableExists(new String("lalala"));
Теперь переменная db будет иметь тип интерфейса DfgDbAdaptee и может содержать любой объект, который реализует этот интерфейс, такой как DfgDbSqliteAdapter или DfgDbFMDBAdapter.
Для описания типа, который может быть одним из классов DfgDbSqliteAdapter или DfgDbFMDBAdapter, вы можете использовать тип интерфейса DfgDbAdaptee. Измените метод Factory() класса DfgDb следующим образом:
public class DfgDb {public static DfgDbAdaptee Factory()
{
int dbType = DfgAppConfig.getDbType();
if (dbType == DfgAppConfig.DBTYPE_SQLITE){
return new DfgDbSqliteAdapter;
}else if (dbType == DfgAppConfig.DBTYPE_FMDB){
return new DfgDbFMDBAdapter;
}
throw new DfgConfigException("Unknown db type in config");
}
}
Используйте тип DfgDbAdaptee для переменной, которая хранит результат вызова Factory():
DfgDbAdaptee db = DfgDb.Factory();db.checkTableExists(new String("lalala"));
Теперь переменная db будет иметь тип интерфейса DfgDbAdaptee и может содержать любой объект, который реализует этот интерфейс, такой как DfgDbSqliteAdapter или DfgDbFMDBAdapter.