如何描述一个以bool Contains(T)方法作为接口的T?

时间:2013-03-31 18:43:46

标签: c# .net interface

我希望有一个类似于string.Contains的行为接口,比如说有一个代表RabbitMq标记之类的东西。假设'1.222.3331.1'并在其上说.Contains( 122 )得到错误,.Contains( 1 )成真。

我试过了:

    interface ITag
    {
        bool Contains(ITag tag);
    }

然而,它的实现会限制ContainsITag一起使用,例如:

    class Tag : ITag
    {
        public bool Contains(ITag tag)
        {
            throw new NotImplementedException();
        }
    }

虽然我想举例如:

    class Tag : ITag
    {
        public string s;
        public bool Contains(Tag other)
        {
            return s.Contains(other.s);
        }
    }

我想知道我所描述的可实现的接口和方式,是否有任何外包装.Net接口.Contains

当然我能做到

    interface ITag<T>
    {
        bool Contains(T tag);
    }

而不是像以下那样实现它:

    class Tag : ITag<Tag>
    {
        public Tag(string tag)
        {
            Content = tag;
        }

        public string Content { get; private set; }

        public bool Contains(Tag other)
        {
            return other != null 
                && other.Content != null
                && Content.Contains(other.Content);
        }
    }

然而,我需要制作所有使用ITag<T> Generic的接口,这是不可取的。有一种非通用的方式吗?

2 个答案:

答案 0 :(得分:3)

以下将编译:

interface ITag<in TTag> where TTag : ITag<TTag>
{
    bool Contains(TTag tag);
}

class Tag : ITag<Tag> 
{
    public bool Contains(Tag t)
    {
        return false;
    }
}

也就是说,整个构造并不是非常有用,而只是使用具体类型,因为你总是需要在变量声明中包含它。

答案 1 :(得分:2)

您可以创建两个接口ITagITag<T>,其中通用接口扩展非通用接口,如下所示:

public interface ITag
{
    bool Contains(ITag tag);
}

public interface ITag<T> : ITag
    where T : ITag<T>
{
    bool Contains(T tag);
}

然后在实现ITag<T>的类中,我会做这样的事情:

public class Foo : ITag<Foo>
{
    public bool Contains(Foo tag) ...

    bool ITag.Contains(ITag tag)
    {
        Foo other = tag as Foo;
        if (other == null)
            return false;

        return Contains(other);
    }
}