Klasa abstrakcyjna i instancja podklasy

0

Cześć, czy jest jest możliwość zwrócenia instancji podklasy w taki sposób aby była potem do użycia? Wynikła potrzeba aby napisać własne komponenty do Selenium (button, checkbox itd) i chciałbym to zrobić na jednej klasie abstrakcyjnej, a następnie wołać ComponentFactory z klasy abstrakcyjnej BaseWindow.

public abstract class Component<T> {
    public abstract T getSelf();
}

public class ComboBoxFixture extends Component<ComboBoxFixture> implements ElementValidator {
//inne metody
public void selectItem(){}
        @Override
    public ComboBoxFixture getSelf() {
        return this;
    }

public class ComponentFactory {
    public static Component getManager(ComponentType type){
        Component manager;
        .... = new ComboBoxFixute(); 
}

public class BaseTst {

ComponentFactory.getManager(type).getSelf().selectItem(foo); // i tutaj nie wiem jak wleźć w selectItem
}

1

A czemu factory zwraca ci Component a nie tą podklasę właśnie? Niech zwraca podklasę i już. To o co pytasz wymagałoby rzutowania na podklasę, ale to bardzo nieeleganckie i wybuchnie kiedyś jakimś ClassCastException.

W rzeczywistości pewnie chciałbyś tam mieć generyczną tą fabrykę, z jakimś T getComponent(Cośtam<T> type)

0

Tak, starałem się tu wcisnąć fabrykę lecz nie chce tworzyć dla każdego komponentu oddzielnego interfejsu bo bedzie tego sporo stąd te próby. ComponentFactory zwraca Component tak jak to ma miejsce w wzorcu Factory.
Czy taka generyczna fabryka to schludne rozwiązanie?

1

tak jak to ma miejsce w wzorcu Factory

No ale to ma sens tylko jeśli budujesz obiekty o takim samym interfejsie, a u ciebie wyraźnie nie ma to miejsca! Ty chcesz dostać z tego factory obiekty o różnych interfejsach, a tego nie da się zrobić inaczej niż:

  • mieć osobną metodę dla każdego typu
  • mieć tam genericsy

Czy taka generyczna fabryka to schludne rozwiązanie?

Trudno powiedzieć nie znając kontekstu i reszty kodu, ale jest to normalne i akceptowalne rozwiązanie.

0

Chciałem opatrzyć resztę komponentów (button, textfield...) właśnie klasą abstrakcyjną Component lecz blokuje mnie dostęp do podklas. Jakbym to widział:
ComboBoxFixture, ButtonFixture itd == dziedziczą ==> Component ==> ComponentFactory ==> wykorzystuje w BaseWindow. Chce uzyskać efekt gdzie mam jedno pole Component i w zależności od wywołania dostaję ComboBoxa, Buttona itd.

public abstract class Window<T> {
    protected final Webdriver driver;
    protected String windowTitle;
    protected Component component; // klasa abstrakcyjna
    public abstract T open();

    protected Component componentManager(ComponentFactory.ComponentType type){
        this.component = ComponentFactory.getManager(type);
        return component;
    }
0

No ale to NIE MA SENSU skoro interesuje cię interfejs podklas a nie tego Component. Takie rozwiązanie sprawadza się tylko jeśli masz wszędzie ten sam interfejs! W twoim przypadku powinieneś tam mieć generyka, więc jakieś Window<T,S extends Component>, S component i factory też powinno ci zwracać obiekt konkretnego typu. Wtedy faktycznie masz dostęp do interfejsu podklasy jak sobie zrobisz jakiś Window<Cośtam, ComboBoxFixture>

1 użytkowników online, w tym zalogowanych: 0, gości: 1