【问题标题】:How to reference the implementing class from an interface?如何从接口引用实现类?
【发布时间】:2011-11-20 15:02:24
【问题描述】:

我正在创建一个接口,我需要一个方法来引用实现该接口的类的类实例。这是一个例子:

class MyClass : IMyInterface{
    public void MyMethod(MyClass a){...} //implemented from the interface.
}

那么我应该如何实现我的接口(没有泛型)来引用实现它的类?

interface IMyInterface{
    void MyMethod(??? a);
}

??? 部分应该是什么?

谢谢, 可以。

【问题讨论】:

  • 您究竟为什么要这样做?为什么不想使用泛型?
  • 出于好奇,您能告诉我们出于什么目的您需要这样的界面吗?
  • 作为对以下答案的评论发布。

标签: c# .net c#-4.0 interface


【解决方案1】:

C# 类型系统不够复杂,无法很好地表示“自我”类型的概念。 IMO,理想的解决方案是放弃这个目标,只依赖于接口类型:

interface IMyInterface
{
    void MyMethod(IMyInterface a);
}

如果这还不够,通常表明接口指定不当;如果可能,您应该回到绘图板并寻找替代设计。

但如果你仍然真的需要这个,你可以使用CRTP的(某种)C#版本:

interface IMyInterface<TSelf> where TSelf : IMyInterface<TSelf>
{
    void MyMethod(TSelf a);
}

然后:

class MyClass : IMyInterface<MyClass>
{
    public void MyMethod(MyClass a) {...}  //implemented from the interface.
}

请注意,这不是一个完全“安全”的解决方案;没有什么可以阻止邪恶的实现使用不同的类型参数:

class EvilClass : IMyInterface<MyClass>  // TSelf isn't the implementing type anymore...
{
    public void MyMethod(MyClass a) {...}  // Evil...
}

这与您的目标背道而驰。

【讨论】:

  • 但我说过,如果可能的话,我需要一种方法来完成这个没有泛型。第一个更接近但不起作用,因为我需要一个明确的类型名称..它将用于继承情况,类型转换等将使我的代码编写更加困难和容易出错
  • @can poyrazoğlu:抱歉,C# 类型系统不够强大,无法表示“自我”类型的概念。据我所知,没有其他选择。
  • 好的,如果这是不可能的,那么我会按照你的方式去......谢谢
  • @canpoyrazoğlu,如果您告诉我们您认为您需要这个的确切原因,也许我们可以为您提供更好的帮助。
  • @svick 太长了,无法将整个内容放在这里,但我会尝试以简单的方式解释它:我正在制作一个对象具有这种层次结构的游戏。 GameObject 接口,其中 T 是要返回的确切类型,并且有 CreateNew 方法根据模板中的数据返回一个 T,模板类也有类似的继承,我试图对其进行排序出来。
【解决方案2】:

只需使用IMyInterface 而不是MyClass。它将能够接受从该接口派生并使用该接口的任何内容。如果您出于某种原因不想要这个,仍然可以这样做,但在界面中添加一些其他“检查”,例如public bool IsValidParam() 或其他。一般来说,我会考虑这种糟糕的设计(接口不应该依赖于该实际接口的任何实现,而不是接口本身提供的东西)。

【讨论】:

  • 它在技术上可以工作,但是接口将通过继承层次结构中的类的泛型(对于其他东西)以不同的方式实现,并且类型转换会搞砸
  • 仍然不建议这样做。这样做是否有一些特定的场景或原因?如果有一些特定于一个或多个实现的参数,我不会将它添加到通用接口中。
  • 不,没有特定的类型。系统中有太多的继承,所有都实现了一个通用接口,我只是不想让事情变得更复杂。所以这是“代码净化”的原因,而不是“技术原因”
  • 所以你猜你不想使用接口作为参数的类型,因为使用了实现类的一些东西?反正它越来越脏,你可以简单地使用object 并将其转换为实现。您不会以这种方式进行类型检查,但可能会使其更易于使用,然后重组使用该接口的所有实例。
  • 我实际上需要一个很好的方法来“链接”这个场景:有类型层次结构,它们有相应的“模板”类作为工厂,对于每个模板,我简单地构建一个机制这将采用目标(针对模板类型固定)类型的对象并将模板属性复制到其中,并且派生模板将简单地创建自己的目标类型,将其传递给基模板类的相同方法以填充它,并且然后添加它派生的特定字段,有几种方法可以实现这一点,我正在寻找最好的方法,并认为以这种方式很容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多