用接口隐藏类时,重写的实现是否仍保留?(WebDriver场景)
你的自定义Click实现完全有效!
这其实是C#多态机制的典型场景,不管你返回的是IPageElement还是IWebElement类型的引用,实际调用Click()时都会执行你在PageElement里写的带等待和异常处理的逻辑,原因如下:
- 接口调用基于运行时类型:C#中,当你通过接口引用调用方法时,实际执行的是当前引用指向的实际对象类型的方法实现。你的
GetSomething()和GetSomethingElse()返回的都是PageElement实例,只是编译时被声明为不同的接口类型,但运行时对象的本质还是PageElement。 - 接口实现的多态性:
PageElement直接实现了IWebElement的Click()方法,同时因为IPageElement继承自IWebElement,所以也自动满足了IPageElement对Click()的要求。不管你用哪个接口引用来调用,都会触发PageElement里的自定义实现。
举个简化的代码例子验证一下:
// 模拟你的接口结构 public interface IWebElement { void Click(); } public interface IPageElement : IWebElement { } public class PageElement : IPageElement { public void Click() { Console.WriteLine("执行自定义Click:等待元素就绪 + 异常处理"); } } // 你的两个方法 IPageElement GetSomething() => new PageElement(); IWebElement GetSomethingElse() => new PageElement(); // 调用测试 GetSomething().Click(); // 输出:执行自定义Click:等待元素就绪 + 异常处理 GetSomethingElse().Click(); // 同样输出上面的内容
哪怕你后续让PageElement继承自WebDriver库中的某个具体元素类(比如RemoteWebElement)并重写Click()方法,结果也是一样的——重写的方法会覆盖基类的实现,运行时依然会调用你的自定义逻辑。
总结一下:完全不用担心返回类型截断的问题,你的自定义Click逻辑在两种返回场景下都会正常生效。
内容的提问来源于stack exchange,提问作者ephemeris
相关产品推荐
相关产品推荐

