如何使用子类参数实现接口方法?

ozg*_*gur 0 c# inheritance interface

这是界面

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

    bool CheckTargetExists(ProjectBase project);
}
Run Code Online (Sandbox Code Playgroud)

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

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

这个TargetLocalProject类继承自ProjectBase类。但是,我收到一条错误消息,指出“LocalTransporter 类未实现接口成员”并指向该BeginTransport方法。

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

此外,有几种不同的Transporter类型,因此我需要使用 interface 与它进行交互ITransporter

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

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

Ron*_*yer 5

您可以为此使用泛型,只需稍微更改您的界面:

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

    bool CheckTargetExists(T project);
}
Run Code Online (Sandbox Code Playgroud)

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

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