Я извиняюсь, если этот вопрос уже спросил, я не нашел ничего подобного мой вопрос еще ...Использование конкретного класса из абстрактного типа переменной
Я работаю/игры/обучения, чтобы построить в какой-то среде тестирования ... Внутри я создаю Application Layer (пакет классов, являющийся виртуальным представлением разных страниц/окон/форм) приложения. Упрощенная настройка заключается в следующем:
public abstract class WebPage {
protected WebDriver driver;
protected WebElement getElement(By by){
WebElement element = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(by));
return element;
}
public void menuLogout(){
System.out.println("Logged out");
}
}
public class HomePage extends WebPage {
public ProfilePage ClickLinktoProfilePage(){
return new ProfilePage();
}
public DashBoardPage clickViewDashboard(){
return new DashBoardPage();
}
public String getTitle(){
return getElement(By.id("title")).getText();
}
}
public class ProfilePage extends WebPage {
public String getUsername(){
return getElement(By.id("name")).getText();
}
public String getEmail(){
return getElement(By.id("email")).getText();
}
public HomePage clickReturnToHomePage(){
return new HomePage();
}
}
public class DashBoardPage extends WebPage {
public String getcurrentPeriod(){
return getElement(By.id("name")).getText();
}
}
Идея заключается в том, что я хочу, чтобы мой тест, чтобы провести только один текущий WebPage. Я не хочу создавать новую переменную каждый раз, когда меняю страницу.
Я также не хочу, чтобы меня заставляли заранее знать, на какой странице я направляюсь. Я хочу, чтобы Application Layer дал мне поток приложения. Точно так же, когда при нажатии ссылки вы попадаете на следующую страницу, я хочу, чтобы при нажатии ссылки, которая выводит меня на другую страницу, этот метод сообщает мне, на какой странице я направляюсь.
(WebPage абстрактный класс также предоставляет множество общих методов между всеми конкретными WebPages)
Так что мой предполагаемое использование было:
WebPage currentPage = new HomePage();
currentPage = currentPage.ClickLinktoProfilePage(); //currentPage = new ProfilePage();
System.out.println(currentPage.getUsername());
currentPage.menuLogout();
К сожалению, это не работает, так как переменная CurrentPage набирается, как WebPage, он не видит ни одного из методов конкретных классов. Я нахожу его логичным и нечетным одновременно, потому что я могу спросить «currentPage.getClass(). GetName();» и он вернет «packageName.ConcreteClassName».
Чтобы Typecasting работал, мне нужно будет переопределить тип переменной ... (не уверен, что это возможно или даже полезно делать).
Так что я знаю, что могу найти имя класса внутри переменной, но я не уверен, куда идти оттуда.
У кого-нибудь есть решение?
Используйте конкретный тип, т.е. 'Page1' или литой? –
Вы пытаетесь вызвать либо 'clickLink()', либо 'printHello()' в зависимости от фактического типа? Тип вставляется в локальную переменную или переписывает родительский класс (или интерфейс), чтобы потребовать метод абстрактного void doSomething() и переопределить абстрактное поведение в каждом дочернем классе. – ryanyuyu
@ roux69: Образцы кода недействительны Java. В этом случае я думаю, что все здесь могут понять, что вы имеете в виду, но лучше использовать примеры кода, которые на самом деле демонстрируют вашу проблему. Дополнительную информацию см. На странице http://stackoverflow.com/help/mcve. –