【问题标题】:How to implement Interface method with subclass argument?如何使用子类参数实现接口方法?
【发布时间】:2016-01-27 08:23:53
【问题描述】:

这是界面

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(而不是通过接口)时,参数的类型应该是特定的项目类型而不是基类。

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

【问题讨论】:

  • 听起来你想让你的界面通用。
  • @juharr 你是对的,答案也是。

标签: c# inheritance interface


【解决方案1】:

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

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

【讨论】:

  • 我试过了,完美解决了这个问题。非常感谢。 6 分钟后接受答案=)
【解决方案2】:

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

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

您可以考虑在此处使用visitor pattern

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多