C# 实现接口但返回返回返回类型的子类?

C# 实现接口但返回返回返回类型的子类?,c#,inheritance,interface,casting,C#,Inheritance,Interface,Casting,我正在C#中使用ASP.NET MVC。我正在创建服务类。我有一个用于驱动程序服务接口(IDriverService)的服务接口 它具有以下方法定义: Driver New(); 我有两个实现此接口的实现,它们实现了此方法: Driver New() { return new Driver(); } Driver New() { return new SubclassOfDriver(); } 正如您所见,一个实现通过返回基本驱动程序来实现新方法,另一个实现用于驱动程序的某个子

我正在C#中使用ASP.NET MVC。我正在创建服务类。我有一个用于驱动程序服务接口(IDriverService)的服务接口

它具有以下方法定义:

Driver New();
我有两个实现此接口的实现,它们实现了此方法:

Driver New()
{
   return new Driver();
}

Driver New()
{
   return new SubclassOfDriver();
}
正如您所见,一个实现通过返回基本驱动程序来实现新方法,另一个实现用于驱动程序的某个子类

问题是,通过实现接口,我必须返回一个“Driver”,但有时我想返回一个“subassofdriver”。我可以说,您应该将结果强制转换为所需的驱动程序,但这是不安全的,编码人员需要有关实现的信息来确定已实例化的驱动程序。最好的方法是什么


谢谢

子类驾驶员
是一名
驾驶员


这没有什么问题。

您可以使用显式接口实现有效地重载返回类型:

Driver IDriverService.New()
{
   return New(); // Calls the method below
}

public SubclassOfDriver New()
{
   return new SubclassOfDriver();
}
现在,任何只知道您作为接口实现的实现的代码都将看到显式接口实现方法,只需要返回类型
Driver

任何通过具体类型引用服务的代码将只看到第二个方法,并期望返回类型为
subassofdriver
。例如:

SpecialFactory specialFactory = new SpecialFactory();
SubclassOfDriver subclassDriver = specialFactory.New(); // Fine
IDriverFactory generalFactory = specialFactory;
IDriver generalDriver = generalFactory.New(); // Fine
// This wouldn't compile
SubclassOfDriver invalid = generalFactory.New();
或者,您可能希望使接口通用:

public interface IDriverFactory<TDriver> where TDriver : Driver
{
    TDriver New();
}

public class SpecialDriverFactory : IDriverFactory<SubclassOfDriver>
{
    public SubclassOfDriver New()
    {
        return new SubclassOfDriver();
    }
}
公共接口IDriver工厂,其中TDriver:驱动程序
{
TDriver New();
}
公共类专用河流工厂:IDriverFactory
{
新河公共子类()
{
返回新的子类河();
}
}
您可以使用泛型:

public class Driver { }
public class SubclassOfDriver : Driver { }

public interface IDriverService<T> where T : Driver
{
    T New();
}

public class SpecificService : IDriverService<Driver>
{
    public Driver New()
    {
        return ...;
    }
}

public class OtherSpecificService : IDriverService<SubclassOfDriver>
{
    public SubclassOfDriver New()
    {
        return ...;
    }
}
公共类驱动程序{}
公共类子类:驱动程序{}
公共接口IDriverService,其中T:驱动程序
{
T新的();
}
公共类特定服务:IDriverService
{
公共司机(新)
{
返回。。。;
}
}
公共类其他特定服务:IDriverService
{
新河公共子类()
{
返回。。。;
}
}
问题是通过实现接口,我必须返回
驱动程序
,但有时我想返回
子类驱动程序

问题不在于返回
驱动程序
,而在于“有时希望返回类型为
子类驱动程序
”。如果您的代码在某些情况下需要实现
IDriverService
以返回派生类型,那么您选择的抽象级别不适合您的需要。将实现隐藏在接口后面的原则(即将
子类流
隐藏在
驱动程序
后面)是,您不应该需要进行特定于
子类流
的调用


解决此问题的一种方法是重构
驱动程序
类,以包含
子类驱动程序
的方法,这些方法在其他情况下不可用。您可以将这些方法设置为可选方法,让调用方测试特定子类是否实现了它们。

您可以返回接口而不是类(因此
IDriver New();
)强制转换到基类不是不安全的,甚至是不必要的。这是一个隐式的安全转换。客户端不应该关心实例化了哪个
驱动程序
,如果他这样做了,那就是一种设计气味。@Frammo一旦你得到了驱动程序的实例,为什么要将其转换回subassofdriver?