gpt4 book ai didi

c# - 为什么不能用派生类代替接口(interface)成员中的基类?

转载 作者:太空狗 更新时间:2023-10-30 01:29:42 27 4
gpt4 key购买 nike

我无法创建可与派生类一起使用的接口(interface)的实现。我一直认为这是可能的,我很困惑为什么我不能这样做。如果我将 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' 没有实现接口(interface)成员 'SomeInterface.Method(BaseType)'

为什么这不可能?我遇到了一个现实世界的情况,这会很有用。

例如,Selenium WebDriver 有许多浏览器驱动程序。有一个带有派生类(ChromeOptionsFirefoxOptions 等)的抽象 DriverOptions 类。

这是我遇到的现实世界问题的一个例子:

// 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();

关于c# - 为什么不能用派生类代替接口(interface)成员中的基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50371510/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com