2015-06-30 3 views
0

мне нужно возвращать объекты различных классов в одном методе с использованием объекта ключевого слова в качестве возвращаемого типаКак вернуть объекты разных типов из одной функции?

public class ObjectFactory { 
public static Object assignObject(String type) { 

    if(type.equalsIgnoreCase("abc")){ 
     return new abcClass(); 
    } else if(type.equalsIgnoreCase("def")) { 
     return new defClass(); 
    } else if(type.equalsIgnoreCase("ghi")) { 
     return new ghiClass(); 
    } 
    return null; 
    } 
} 

и в другом классе я пытаюсь получить объекты, как

public class xyz{ 
public void get(){ 
    Object obj=(abcClass)ObjectFactory.assignObject("abc"); 
} 
} 

Как можно Я обращаюсь к методам в abcClass, используя объект obj?

+0

Вы объявляете тип переменной '' obj' к abcClass'. – Clashsoft

+0

Измените объект в 'Object obj = ...' на класс, на который вы производите: 'abcClass obj = ...' – Aerus

+0

Если obj должен оставаться Объектом, вы можете передать его в abcClass, если знаете, что он всегда будет быть abcClass. Для ex '((abcClass) obj) .methodInAbcClass();' – bhcmoney

ответ

1

Ваш текущий код будет сгенерировано исключение, если assignObject возвращает экземпляр, который не является abcClass, так что вы можете изменить тип obj к absClass:

public void get(){ 
    abcClass obj=(abcClass)ObjectFactory.assignObject("abc"); 
} 
0

Вы можете использовать это как refrence: -

public Object varyingReturnType(String testString){ 
    if(testString == null) 
    return 1; 
    else return testString ; 
} 

Object o1 = varyingReturnType("Lets Check String"); 
if( o1 instanceof String) //return true 
String now = (String) o1; 
Object o2 = varyingReturnType(null); 
if( o2 instanceof Integer) //return true 
int i = (Integer)o2; 

Так же вы можете использовать свои собственные условия, наряду с оператором instanceof и может бросить его, чтобы получить фактический тип объекта из Object типа.

1

Я бы предложил, как сказал один из комментаторов вашего начального сообщения. То есть, реорганизовать это, чтобы использовать интерфейс.

Ваши классы AbcClass, DefClass и GhiClass могли бы реализовать интерфейс, назовем его «Письма». Затем вы можете определить класс, называемый LettersFactory, с помощью метода createLetters. На этом этапе я также рекомендовал бы изменить ваши жестко закодированные идентификаторы строк в перечисление. Например:

public enum LetterTypes { ABC, DEF, GHI } 

Ты Фабричный метод может затем принять это перечисление, и у вас нет опасений получать недопустимые значения. Метод factory также может возвращать тип Letters (интерфейс), и у вас есть более конкретная версия Object (что хорошо).

Наконец, если вам нужно определить эти типы «на лету», вы можете иметь метод, определенный в «Письма» (заставляя всех детей реализовать его), называемый getType(), который возвращает перечисление LetterTypes для реализованного класса.

Вы также можете использовать оператор instanceof для определения того, какой класс у вас есть.

Приветствия, Frank

Смежные вопросы