【问题标题】:Vb.net Interface, make method only accept instances of same type as parameterVb.net 接口,使方法只接受相同类型的实例作为参数
【发布时间】:2012-07-03 16:37:13
【问题描述】:

我试图在我的 vb.net 接口中定义一个方法,该方法只接受从同一接口继承的对象,并且与接收方法调用的实例属于同一类。这在 vb.net 中可行吗?

下面我尝试用一​​个(无效的)泛型类型约束来说明我想要做什么:

Public Interface IFoo

   CompareStuff(Of T as sametype)(obj as T) as Boolean

End Interface

【问题讨论】:

    标签: .net vb.net generics types


    【解决方案1】:

    您正在寻找Curiously recurring template pattern

    我的 VB 有点生疏,所以这里是 C#

    public interface IFoo<T>
        where T : IFoo<T>
    {
        bool CompareStuff(T obj);
    }
    

    然后你就这样实现

    public class Foo : IFoo<Foo>
    {
        bool CompareStuff(Foo obj);
    }
    

    请查看 Eric Lippert 的 this article。特别注意他说的结尾:

    我的建议是,在你用 C# 实现这种奇怪的模式之前要好好思考一下;给客户带来的好处真的超过了您给代码维护者带来的精神负担所带来的成本吗?

    【讨论】:

      【解决方案2】:
      Public Interface IFoo(Of T)
          CompareStuff(obj As T) As Boolean
      

      这样使用:

      Public Class Foo Implements IFoo(Of Foo)
          Function CompareStuff(obj As Foo) As Boolean
      

      但不幸的是,它也允许编译:

      Public Class Bar Implements IFoo(Of Foo)
          Function CompareStuff(obj As Foo) As Boolean
      

      现在想不出任何适当的约束。

      【讨论】:

      • 写完问题我也想到了这个办法。它接近但不是一路... :) C# 中有什么方法(可以翻译)来做我想做的事吗?
      • 我不认为 C# 在这种事情上更具表现力;只是语法往往更短:)
      【解决方案3】:

      如果X 类型派生自Y 类型,并且Y 可以对另一个Y 执行某些操作,那么里氏替换原则要求Y 必须能够对另一个Y 执行相同的操作X,并且X 必须能够对Y 执行相同的操作。将这些要求放在一起,X 必须能够对另一个 X 执行该操作。

      请注意,X 可能能够对另一个 X 执行某些操作,而 Y 无法执行此类操作。

      顺便说一句,虽然为结构和密封类实现IEquatable&lt;T&gt; 很有用,但对于任何类型的任何两个对象,任何对象是否等于任何其他对象的问题都可以得到有意义的回答。例如,如果有一个Cat 的集合,则可以合理地尝试将该集合中的对象与SiameseCat 类型的参数进行比较(虽然该集合可能包含PersianCat 的实例,但它也可能包含一些输入SiameseCat)或输入Animal(一些传入的对象可能是Dog类型。但其他可能是Cat类型)。查询Cat 的集合以查看它是否包含某些特定的Dog 可能是“愚蠢的”,但该集合在回答查询时应该没有问题(“找到零个实例”)。

      【讨论】:

        猜你喜欢
        • 2011-07-06
        • 1970-01-01
        • 2012-06-02
        • 1970-01-01
        • 2016-01-06
        • 2021-04-12
        • 2016-09-18
        • 1970-01-01
        • 2017-11-08
        相关资源
        最近更新 更多