我无法创建可与派生类一起使用的接口的实现。我一直认为这是可能的,但我很困惑为什么我无法做到这一点。如果我改变也是不可能的BaseType
也可以是抽象类。
public interface BaseType {}
public class FirstDerivedClass : BaseType {}
public class SecondDerivedClass : BaseType {}
public interface SomeInterface
{
void Method(BaseType type);
}
public class Implementation : SomeInterface
{
public void Method(FirstDerivedClass type) {}
}
'Implementation' does not implement interface member 'SomeInterface.Method(BaseType)'
为什么这是不可能的?我遇到了一个现实世界的情况,这会很有用。
例如,Selenium WebDriver 有许多浏览器驱动程序。有一个摘要DriverOptions
具有派生类的类 (ChromeOptions
, FirefoxOptions
, etc.).
这是我遇到的现实世界问题的一个例子:
// Third party code - Selenium.
public abstract class DriverOptions {}
public class ChromeOptions : DriverOptions {}
public class FirefoxOptions : DriverOptions {}
// My code
public interface IWebDriverFactory
{
IWebDriver GetWebDriver(DriverOptions options);
}
public class ChromeWebDriverFactory : IWebDriverFactory
{
public IWebDriver GetWebDriver(ChromeOptions options)
{
// implementation details for initalising Chrome and use options from ChromeOptions
}
}
public class FirefoxWebDriverFactory : IWebDriverFactory
{
public IWebDriver GetWebDriver(FirefoxOptions options)
{
// implementation details for initalising Firefox and use options from FirefoxOptions
}
}
您可以使用泛型类型和逆变来解决这个问题。您的代码应如下所示:
// Third party code - Selenium.
public abstract class DriverOptions { }
public class ChromeOptions : DriverOptions { }
public class FirefoxOptions : DriverOptions { }
// My code
public interface IWebDriverFactory<in T> where T:DriverOptions
{
IWebDriver GetWebDriver(T options);
}
public class ChromeWebDriverFactory : IWebDriverFactory<ChromeOptions>
{
public IWebDriver GetWebDriver(ChromeOptions options)
{
// implementation details for initalising Chrome and use options from ChromeOptions
}
}
public class FirefoxWebDriverFactory : IWebDriverFactory<FirefoxOptions>
{
public IWebDriver GetWebDriver(FirefoxOptions options)
{
// implementation details for initalising Firefox and use options from FirefoxOptions
}
}
正如 @TSmith 建议的 -> 用法:var a = new FirefoxWebDriverFactory();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)