C#如何避免一般推送<;T>;方法与非泛型方法发生签名冲突?

C#如何避免一般推送<;T>;方法与非泛型方法发生签名冲突?,c#,generics,inheritance,overriding,abstract-class,C#,Generics,Inheritance,Overriding,Abstract Class,我遇到了一个我无法解决的问题。我有一个提供方法签名的接口。此方法接收字符串,并返回布尔值 然后,该接口由一个抽象类实现,该抽象类采用泛型类型T参数来定义接口函数的重载版本。这个重载方法接受一个T并返回一个bool。同样,接口方法被抽象出来,由具体类而不是抽象实现来实现 当具体类输入T的字符串时,我遇到了一个问题,因为它似乎会在接口方法签名和抽象方法签名之间造成某种冲突。我试图寻找一个解决方案,但我的谷歌fu失败了 编译时,我收到以下错误消息: 错误2“foobertest1.StringFoo”

我遇到了一个我无法解决的问题。我有一个提供方法签名的接口。此方法接收字符串,并返回布尔值

然后,该接口由一个抽象类实现,该抽象类采用泛型类型T参数来定义接口函数的重载版本。这个重载方法接受一个T并返回一个bool。同样,接口方法被抽象出来,由具体类而不是抽象实现来实现

当具体类输入T的字符串时,我遇到了一个问题,因为它似乎会在接口方法签名和抽象方法签名之间造成某种冲突。我试图寻找一个解决方案,但我的谷歌fu失败了

编译时,我收到以下错误消息:

错误2“foobertest1.StringFoo”未实现继承的抽象成员“foobertest1.AFoo.Bar(string)”Program.cs 41 18控制台应用程序1

错误3继承的成员“foobertest1.AFoo.Bar(string)”和“foobertest1.AFoo.Bar(T)”在类型“foobertest1.StringFoo”中具有相同的签名,因此它们不能被ConsoleApplication1\Program.cs 43 30 ConsoleApplication1覆盖

除了更改其中一个方法名之外,还有没有一种干净的方法可以解决这个问题?(下面的示例代码)

名称空间foobertest1
{
公共课程
{
静态void Main(字符串[]参数)
{
Foo f=新的Foo();
}
}
公共接口IFoo
{
bool-Bar(字符串foo);
}
公共抽象类AFoo:IFoo
{
公共摘要栏(字符串foo);
公共抽象布尔吧(T foo);
}
公共类IntFoo:AFoo
{
公共覆盖布尔条(字符串foo)
{
返回true;
}
公共覆盖布尔条(int foo)
{
返回条(foo.ToString());
}
}
公共类StringFoo:AFoo
{
公共覆盖布尔条(字符串foo)
{
返回true;
}
}
}

您必须重命名该方法(或更改签名)。问题是,如果
T
的类型为
String
,那么这两个
Bar
方法会发生冲突。换句话说,当
T
是一个字符串时,您不再重载该方法-您正在复制该方法,这是一个错误

要问的一个问题是,“Bar的字符串实现与泛型实现有什么不同(特别是在泛型类型为字符串的情况下)?”如果答案是“它们不同是因为…”,那么更改名称以反映不同的行为应该是有意义的

如果实现是相同的,那么实现中的逻辑应该处理这种情况,并且您只需要一个具有该签名的方法。换句话说,您可以只保留带有字符串参数的实现,然后检查方法内部的
T
类型,以便在需要时执行其他操作

否则,如果您不想重命名或删除其中一个,可以执行以下操作:

public abstract class AFoo<T> : IFoo
{
    // Change the signature without renaming
    public abstract bool Bar(string foo, string baz); 
    public abstract bool Bar(T foo);
}
公共抽象类AFoo:IFoo
{
//更改签名而不重命名
公共摘要栏(字符串foo,字符串baz);
公共抽象布尔吧(T foo);
}

是的,有一种方法可以避免更改方法名称。使用显式接口实现(请参阅),如下所示:

public abstract class AFoo<T> : IFoo
{
    // Change the signature without renaming
    abstract bool IFoo.Bar(string foo); 
    public abstract bool Bar(T foo);
}
公共抽象类AFoo:IFoo
{
//更改签名而不重命名
抽象bool IFoo.Bar(字符串foo);
公共抽象布尔吧(T foo);
}
AFoo将被用作:

AFoo<String> af = new Implementation();
//Call generic method
Console.Writeline(af.Bar("Hello world!"));
//Call interface method
Console.Writeline(((IFoo)af).Bar("Hello world!"));
AFoo af=新实现();
//调用泛型方法
Console.Writeline(af.Bar(“你好,世界!”);
//调用接口方法
Console.Writeline(((IFoo)af.Bar(“你好,世界!”);

我肯定会更改其中一个方法名称-为了清楚起见,如果没有其他更改的话。如果有人创建了一个
AFoo
,并调用
Bar(“hello”)
,您希望它绑定哪些重载?他们会期待同样的行为吗?如果您重命名一个方法以避免冲突,那么您的生活会简单得多。
AFoo<String> af = new Implementation();
//Call generic method
Console.Writeline(af.Bar("Hello world!"));
//Call interface method
Console.Writeline(((IFoo)af).Bar("Hello world!"));