如何用子类参数实现Interface方法

本文关键字:Interface 方法 实现 参数 何用 子类 | 更新日期: 2023-09-27 18:19:34

这是接口

public interface ITransporter
{
    TransporterType TransporterType { get; set; }
    TransportActionResults BeginTransport(
        Project sourceProject, 
        ProjectBase targetProject);
    bool CheckTargetExists(ProjectBase project);
}

这里ProjectBase是用于所有类型的项目类的抽象类。这是实现ITransporter接口的类中的方法。

public class LocalTransporter : ITransporter
{
    public TransportActionResults BeginTransport(
        Project sourceProject, 
        TargetLocalProject targetProject)
    {
        return TransportActionResults.Success;
    }

这个TargetLocalProject类继承自ProjectBase类。但是,我收到一个错误,上面写着"LocalTransporter类不实现接口成员",并指向BeginTransport方法。

这是我的问题。我需要使用基类ProjectBase来实现接口的BeginTransport方法,因为从基类继承了几个不同的项目类,我们不知道将使用哪一个。

此外,还有几个不同的Transporter类型,因此我需要使用接口ITransporter与之交互。

注意:我曾考虑使用ProjectBase而不是TargetLocalProject来实现该方法,但当直接使用LocalTransporter(而不是through接口)时,参数的类型应该是特定的Project类型,而不是基类。

我希望我说清楚了。那么,有没有一种方法可以实现这个接口方法,在接口中使用基类,但在实现方法中使用子类?

如何用子类参数实现Interface方法

您可以为此使用泛型,只需稍微更改一下您的接口:

public interface ITransporter<T> where T : ProjectBase
{
    TransporterType TransporterType { get; set; }
    TransportActionResults BeginTransport(Project sourceProject, T targetProject);
    bool CheckTargetExists(T project);
}

然后你可以在你的具体类中实现它:

public class LocalTransporter : ITransporter<TargetLocalProject>
{
    public TransportActionResults BeginTransport(Project sourceProject, TargetLocalProject targetProject)
    {
        return TransportActionResults.Success;
    }
}

您可以提供如下显式接口实现:

internal class LocalTransporter : ITransporter
{
    public TransportActionResults BeginTransport(
        Project sourceProject,
        TargetLocalProject targetProject)
    {
        // specific implementation
        return TransportActionResults.Success;
    }
    public TransporterType TransporterType { get; set; }
    TransportActionResults ITransporter.BeginTransport(Project sourceProject, ProjectBase targetProject)
    {
        // generic implementation
        return TransportActionResults.Success;
    }
    public bool CheckTargetExists(ProjectBase project)
    {
        return true;
    }
}

您可能需要考虑在此处使用访问者模式。