实现接口,但返回返回类型的子类

本文关键字:返回类型 子类 返回 接口 实现 | 更新日期: 2023-09-27 18:34:09

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

它具有以下方法定义:

Driver New();

我有两个这个接口的实现,它实现了这个方法:

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

如您所见,一个实现通过返回基本驱动程序来实现 New 方法,另一个实现用于驱动程序的某个子类。

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

谢谢

实现接口,但返回返回类型的子类

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

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

现在,任何只知道您的实现作为接口实现的代码都将看到显式接口实现方法,并且只期望返回类型为 Driver

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

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

问题是通过实现接口,我必须返回一个Driver但有时我想返回一个SubclassOfDriver

问题不在于返回Driver,而在于"有时希望返回类型SubclassOfDriver"。如果代码在某些情况下需要IDriverService的实现来返回派生类型,则选择了不符合您需求的抽象级别。将实现隐藏在接口后面(即将SubclassOfDriver隐藏在Driver后面)的原则是,您永远不需要进行特定于SubclassOfDriver的调用。

解决此问题的一种方法是重构 Driver 类以包含否则不可用的SubclassOfDriver方法。您可以将这些方法设置为可选,让调用方测试特定子类是否实现它们。

SubclassOfDriver是一个Driver

这没有错。

您可以使用泛型:

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 ...;
    }
}