我希望有一个类似于string.Contains
的行为接口,比如说有一个代表RabbitMq标记之类的东西。假设'1.222.3331.1'
并在其上说.Contains(
122 )
得到错误,.Contains(
1 )
成真。
我试过了:
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>
Generic的接口,这是不可取的。有一种非通用的方式吗?
答案 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)
您可以创建两个接口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);
}
}