如何描述一个具有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);
}
然而,它的实现将限制Contains
与ITag
一起工作,给出如下:
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>
通用,这是不希望的。有没有非通用的方法?
将编译以下代码:
interface ITag<in TTag> where TTag : ITag<TTag>
{
bool Contains(TTag tag);
}
class Tag : ITag<Tag>
{
public bool Contains(Tag t)
{
return false;
}
}
也就是说,与只使用具体类型相比,整个结构并不是很有用,因为您总是需要在变量声明中包含它。
您可以创建两个接口ITag
和ITag<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);
}
}