我正在寻求强制接口的实现,以便在创建父类的任何子类时,我可以保证实现接口。由于它从父类继承了实现,我不知道该怎么做。
以下是我的代码的简化视图....
public interface IPage {
bool EvaluateLoadStatus();
string PageTitle { get; }
}
public abstract class BasePage<T> {
}
public class HomePage : BasePage<HomePage>, IPage {
[FindsBy("a[class*='close-all-tabs']", How.CssSelector)]
public Control CloseAllTabsBtn;
[FindsBy("//div[@role='tabpanel'][@class='tab-pane active']//div[@class='alerts']/div[contains(@class,'alert-success')]", How.XPath)]
public Control RecordSavedSuccess;
public string PageTitle { get; }
public HomePage(IWebDriver driver) : base(driver) {
PageFactory.InitializeElements<HomePage>(driver, this);
}
public void LogOut() {
Click(inControl: ProfilePhoto).Click(inControl: LogOutLink);
}
public bool EvaluateLoadStatus() {
//Implementation
}
}
public class UserPage : HomePage, IPage {
//Is it possible to force an implementation of IPage here?
}
EvaluateLoadStatus()
方法和PageTitle
属性的实现HomePage
上的某些属性,字段和方法我愿意设计更改,假设它仍然允许上述各点。
编辑:我在HomePage
课程上面添加了更多代码来演示此问题。 Control在构造函数中初始化,并将在HomePage
的实例和任何子类中使用。
非常感谢
答案 0 :(得分:1)
你的设计中的某些东西似乎&#34;臭&#34;对我来说,但我没有看到整个结构。
如果您真的需要像您所解释的结构,可以在HomePage
和UserPage
之间添加另一个抽象类
public class HomePage : BasePage<HomePage>, IPage {
public virtual bool EvaluateLoadStatus() { //MARK AS VIRTUAL
//Implementation
}
}
public abstract class BaseUserPage : HomePage, IPage {
public abstract override bool EvaluateLoadStatus();
}
public class UserPage : BaseUserPage , IPage {
public abstract override bool EvaluateLoadStatus(){
//new implementation
}
}
但是如果层次结构需要保持不变。您无法强制子类在编译时覆盖您的方法。