代码之家  ›  专栏  ›  技术社区  ›  DanP

VB.NET通用约束和子类

  •  0
  • DanP  · 技术社区  · 14 年前

    考虑以下扩展方法:

        <Extension()> _
        Public Function Satisfies(Of T)(ByVal subject As T, ByVal specification As ISpecification(Of T)) As Boolean
            Return specification.IsSatisfiedBy(subject)
        End Function
    

    如果主题是规范中所操作的确切类别,则此项工作正常。但是,如果规范正在检查T的超级类,则除非主题显式转换为超级类,否则此扩展将不起作用。我有办法避免这个吗?到目前为止,我能想到的最好的办法是:

        <Extension()> _
        Public Function Satisfies(Of T As Class, K As Class)(ByVal subject As T, ByVal specification As ISpecification(Of K)) As Boolean
            Return specification.IsSatisfiedBy(TryCast(subject, K))
        End Function
    

    但我忍不住觉得有更好的办法……

    更新:

    由于语言本身的限制,我(显然)无法让它完全按照我在vb.net中所希望的方式工作,我的第二次尝试是最安全/最有效的方法吗?

    2 回复  |  直到 14 年前
        1
  •  4
  •   John Saunders    14 年前

    这是通过在VB中应用的扩展方法来实现的。我不知道为什么他们为vb构建了不同的扩展,但是对于vb,约束tderive:tbase不存在。不幸的是,如果没有它,就不能将dterived强制转换为tbase,因此issatisfiedby函数失败。供参考:

    Extension method ' <methodname> ' has type constraints that can never be satisfied

    第一个实现似乎是唯一可行的,这是在VB框架中如何设计扩展方法的一个限制。

        2
  •  1
  •   jeroenh    14 年前

    我在想这样的事情应该行得通,但它没有:

    <Extension()> 
    Public Function Satisfies(Of TBase, TDerived As TBase)(
               ByVal subject As TDerived, 
               ByVal specification As ISpecification(Of TBase)) As Boolean
        Return specification.IsSatisfiedBy(subject)
    End Function
    

    VB编译器说:“extension method”满足“具有永远无法满足的类型约束”,这很奇怪,因为在C中它确实起作用:

    public static class Extensions
    {
        public static bool Satisfies<TDerived, TBase>(
                  this TDerived subject, 
                  ISpecification<TBase> spec) where TDerived:TBase
        {
            return spec.IsSatisfiedBy(subject);
        }
    }
    
    public interface ISpecification<T>
    {
        bool IsSatisfiedBy(T subject);
    }
    

    因此,答案似乎是:将c_用于这个构造,或者,如@dario所指出的,将满足方法实现为常规模块方法,而不是扩展方法。