【问题标题】:Is possible to force implementation of an interface on a subclass where the parent already has an implementation?是否可以在父类已经实现的子类上强制实现接口?
【发布时间】: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,并让HomePageUserPage 继承自这个abstract 基类。
  • NotImplementedException 指出出了什么问题。您想要abstract EvaluateLoadStatus() 而不是抛出异常,这意味着您必须在某处拥有基础abstract class。考虑通过BasePage&lt;T&gt; 或通过创建另一个基础abstract class BasePageHomePage: BasePage&lt;HomePage&gt;, IPage 来实现IPage(作为abstract 成员),然后从该基础继承所有页面。
  • 使 HomePage 密封,将所有抽象部分移动到一个抽象父类,这是其他类必须继承的,强制它们实现抽象位,同时仍然允许您实例化 HomePage。那些(你的抽象父级的)其他后代不会是 HomePage 的后代。

标签: c# inheritance interface abstract


【解决方案1】:

你的设计中的某些东西对我来说似乎很“臭”,但我没有看到整个构造。

如果你真的需要你解释的结构,你可以在HomePageUserPage之间添加另一个抽象类

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
    }
}

但如果层次结构需要保持原样。您不能强制子类在编译时覆盖您的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多