【问题标题】:Force implementing classes to use their own type as the type for a method parameter强制实现类使用自己的类型作为方法参数的类型
【发布时间】:2013-05-18 00:11:27
【问题描述】:

我有一个由一组对象实现的接口。我希望集合中的所有对象都实现 MemberWiseCompare(ImplementingType rhs) 方法,该方法要求它们使用自己的类型作为参数类型。

经过一番研究,我似乎可以改变我的界面:

  public interface IMyInterface

 public interface IMyInterface<T>

然后使用T 作为MemeberWiseCompare 方法的参数类型。但是,我希望有一个替代解决方案,因为这会产生 200 个编译器错误,因此需要做很多工作。此外,我认为这可能会导致一些问题,因为在某些地方我使用 IMyInterface 作为返回或参数类型,并且我确信将所有这些更改为通用版本会使代码复杂化。有没有其他方法可以做到这一点?有没有更好的选择?

【问题讨论】:

  • 泛型是要走的路。
  • C# 中有“奇怪的重复模板模式”except it's not particularly enforceable。但是同样给它一个评论。对于返回现在非泛型接口的现有方法,您可以将此版本保留为泛型版本的基础,并且不需要需要泛型的代码仍然可以工作。
  • 什么样的编译器错误?将public interface IMyInterface&lt;T&gt;:IMyInterface 作为中间步骤会有帮助吗?
  • 这不是F-bounded polymorphism 有用的地方吗?如果是这样,不幸的是它在 C# 中不可用

标签: c# .net oop generics


【解决方案1】:

我假设你的界面目前看起来像:

public interface IMyInterface
{
    bool MemberwiseCompare(object other);
}

在这种情况下,您可以将其更改为:

public interface IMyInterface
{
    bool MemberwiseCompare<T>(T other) where T : IMyInterface;
}

这使接口保持非泛型,但在传递调用MemberwiseCompare 时为您提供一些额外的类型安全性。实现不需要更改(除了它们的签名),因为它们目前无论如何都必须进行运行时类型检查。我认为由于泛型参数的类型推断,大多数调用站点都不需要更改。

编辑:另一种可能性是您可以添加通用IMyInterface&lt;T&gt; 接口,并让您的实现类实现这两个接口(一个需要显式实现)。然后你可以逐渐转移到通用接口,同时淘汰非通用版本,例如

public class MyClass : IMyInterface, IMyInterface<MyClass>
{
    public bool MemberwiseCompare(MyClass other) { ... }
    bool IMyInterface.MemberwiseCompare(object other)
    {
        MyClass mc = other as MyClass;
        return mc != null && this.MemberwiseCompare(mc);
    }
}

【讨论】:

  • 这更符合我的意愿。我将把问题留待更长时间,看看是否有其他好的建议,但我怀疑我会找到更合适的建议。
  • @evanmcdonnal 这可能也是我要走的路
猜你喜欢
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 2018-12-31
  • 2021-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多