Java - Изменить ссылочную переменную - PullRequest
0 голосов
/ 21 июня 2011

Итак, я знаю, что ссылочные переменные не могут быть изменены.

Я нахожусь в положении, когда у меня есть два разных класса. Давайте назовем их A и B. У них одни и те же методы (методы называются одинаковыми), они просто указаны для класса.

Мне нужен умный способ переключения между классами для создания экземпляров.

Одним из способов может быть использование некоторых логических тестов, проверяющих, какая опция была выбрана, и затем создание экземпляра соответствующего класса. Хотя я боюсь, что это может стать громоздким и безобразным, поэтому я пытаюсь избежать этого. Должно быть что-то более умное.

В настоящее время я думаю о создании нового класса (например, C), который расширяет тот же класс, что и A и B.

Затем я бы переопределил методы (как, к примеру, классы A и B), а затем выполнил бы методы в зависимости от настройки (то есть, какой класс A или B выбран). Методы будут возвращать то же самое, что и в классе A или B.

Надеюсь, я не говорю полный бред.

Ответы [ 2 ]

6 голосов
/ 21 июня 2011

Один из способов сделать это - использовать Factory Pattern .

Частичная цитата из Википедии:

Как и другие шаблоны для создания, она решает проблему создания объектов (продуктов) без указания точного класса объекта, который будет создан.

Например,

public abstract class Base {

    public abstract void doSomething();
}

public class A extends Base {

    public void doSomething() {
        System.out.println("A");
    }
}

public class B extends Base {

    public void doSomething() {
        System.out.println("B");
    }
}

public class C extends Base {

    public void doSomething() {
        System.out.println("C");
    }
}

public interface BaseFactory {

    public Base createBase(int condition);

}

public class DefaultBaseFactory implements BaseFactory {

    public Base createBase(int condition) {

        switch (condition) {
            case 0 : return new A();
                break;

            case 1: return new B();
                break;

            case 3: return new C();
                break;

            default: return null;
                break;
        }
    }
}
1 голос
/ 21 июня 2011

Ваше объяснение сбивает с толку. Но похоже, что вы должны расширить A и B из общего базового класса (или интерфейса):

abstract class Base {
    public abstract void someMethod();
}

class A extends Base {
    public void someMethod() { System.out.println("A"); }
}

class B extends Base {
    public void someMethod() { System.out.println("B"); }
}

Это означает, что вы можете сделать что-то вроде этого:

Base base;
if (someCondition) {
    base = new A();
}
else {
    base = new B();
}

base.someMethod();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...