2

我希望有一个行为接口,类似于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 的接口,而这是不需要的。有非通用的方法吗?

4

2 回答 2

3

以下将编译:

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

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

也就是说,与仅使用具体类型相比,整个构造并不是很有用,因为您始终需要将其包含在变量声明中。

于 2013-03-31T18:53:48.533 回答
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);
    }
}
于 2013-03-31T20:05:45.933 回答