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

本文关键字:Contains 方法 接口 bool 描述 何描述 一个 | 更新日期: 2023-09-27 18:06:38

我想有一个类似于string.Contains的行为接口,说有一个类代表像RabbitMq标签的东西。假设有'1.222.3331.1',在上面说.Contains( 122 )为假,.Contains( 1 )为真。

I tried:

    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>通用,这是不希望的。有没有非通用的方法?

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

将编译以下代码:

interface ITag<in TTag> where TTag : ITag<TTag>
{
    bool Contains(TTag tag);
}
class Tag : ITag<Tag> 
{
    public bool Contains(Tag t)
    {
        return false;
    }
}

也就是说,与只使用具体类型相比,整个结构并不是很有用,因为您总是需要在变量声明中包含它。

您可以创建两个接口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);
    }
}