是否可以在父类已具有实现的子类上强制实现接口?

时间:2017-06-27 10:09:27

标签: c# inheritance interface abstract

我正在寻求强制接口的实现,以便在创建父类的任何子类时,我可以保证实现接口。由于它从父类继承了实现,我不知道该怎么做。

以下是我的代码的简化视图....

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和UserPage的子类,如UserPage。
  • 我需要能够在HomePage的实例和HomePage的任何子类的实例上使用EvaluateLoadStatus()方法和PageTitle属性的实现
  • 编辑:我还需要访问任何子类HomePage上的某些属性,字段和方法

我愿意设计更改,假设它仍然允许上述各点。

编辑:我在HomePage课程上面添加了更多代码来演示此问题。 Control在构造函数中初始化,并将在HomePage的实例和任何子类中使用。

非常感谢

1 个答案:

答案 0 :(得分:1)

你的设计中的某些东西似乎&#34;臭&#34;对我来说,但我没有看到整个结构。

如果您真的需要像您所解释的结构,可以在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
    }
}

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