【发布时间】:2017-06-27 10:09:27
【问题描述】:
我希望强制实现接口,以便在创建父类的任何子类时,我可以保证接口已实现。由于它继承了父类的实现,我不知道该怎么做。
这是我的代码的简化视图....
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?
}
- 需要确保在新建HomePage子类时提示开发者实现接口。
- 在我的程序中,我需要能够实例化 HomePage 和 HomePage 的子类,例如 UserPage。
- 我需要能够在 HomePage 的实例和 HomePage 的任何子类的实例上使用
EvaluateLoadStatus()方法和PageTitle属性的实现 -
编辑:我还需要访问
HomePage的任何子类中的某些属性、字段和方法
我对设计更改持开放态度,前提是它仍然允许上述几点。
编辑:我在上面的HomePage 类中添加了更多代码来演示该问题。控件在构造函数中初始化,并将用于HomePage 的实例和任何子类。
非常感谢
【问题讨论】:
-
不,您不能根据您的要求强制执行此操作。您必须提供代码分析器或类似工具来指出要求。
-
如果您的应用程序在
HomePage对象上调用EvaluateLoadStatus会发生什么? -
我会将所有共享代码放入一个
abstract HomePageBase,它将接口方法标记为abstract,并让HomePage和UserPage继承自这个abstract基类。 -
NotImplementedException指出出了什么问题。您想要abstract EvaluateLoadStatus()而不是抛出异常,这意味着您必须在某处拥有基础abstract class。考虑通过BasePage<T>或通过创建另一个基础abstract class BasePageHomePage: BasePage<HomePage>, IPage来实现IPage(作为abstract成员),然后从该基础继承所有页面。 -
使 HomePage 密封,将所有抽象部分移动到一个抽象父类,这是其他类必须继承的,强制它们实现抽象位,同时仍然允许您实例化 HomePage。那些(你的抽象父级的)其他后代不会是 HomePage 的后代。
标签: c# inheritance interface abstract